/abc/xyz가 주어지면 sed를 사용하여 /abc/xyz, /abc 및 /xyz를 반환합니다.

/abc/xyz가 주어지면 sed를 사용하여 /abc/xyz, /abc 및 /xyz를 반환합니다.

가능합니까? 많은 URL과 상대 경로가 포함된 HTML 파일이 있습니다. 다 모으고 싶어요. 정규식을 사용하면 HTML을 올바르게 구문 분석할 수 없다는 것을 알고 있지만 어떤 유형의 데이터를 보고 있는지 상관하지 않는 솔루션을 찾고 있습니다. /[A-Za-z0-9_-]*둘 이상의 디렉터리 깊이를 포함하는 모든 경로만 추출해야 합니다 .

/this/is/a/test가 주어지면 나는 다음을 얻어야 합니다:

/this
/is
/a
/test
/this/is
/this/is/a
/this/is/a/test
/is/a
/a/test
/is/a/test

그게 다인 것 같아요. 이에 대한 해결책을 작성할 수 있다면 확신합니다!

답변1

$ sed -n -f script.sed file
/this/is/a/test
/this/is/a
/this/is
/this
/is/a/test
/is/a
/is
/a/test
/a
/test

script.sed어디

:outer
h
:inner
/./ {
    p
    s:/[^/]\{1,\}$::
    t inner
}
g
s:^/[^/]\{1,\}::
t outer

file언급한 예제 경로 이름의 파일이 포함되어 있습니다 .

이 스크립트는 각 입력 줄을 처리하는 이중 루프를 구현합니다. 경로 이름이 있는 줄을 얻을 것으로 예상됩니다.오직.

외부 루프( 표시됨 outer)는 현재 행을 예약된 공간( h)에 복사합니다. 줄이 비어 있으면 내부 루프( 로 표시됨 inner)를 완전히 건너뛰고, 줄이 비어 있지 않으면 현재 줄을 인쇄합니다. 그런 다음 현재 행에서 마지막 행을 제거하고 /<anything>대체 항목으로 인해 데이터가 수정된 경우 t inner내부 루프의 시작 부분으로 다시 루프합니다.

그렇지 않으면 저장된 행이 예약된 공간( )에서 가져와서 g첫 번째 행이 삭제됩니다. /<anything>교체로 인해 데이터가 수정되면 코드는 외부 루프의 시작 부분으로 루프백됩니다.

최종 결과는 전체 경로 이름을 인쇄한 다음 끝에서 연속적인 경로 구성 요소를 제거하여 생성된 각 경로 이름을 얻게 되는 것입니다.

그런 다음 원래 경로 이름에서 첫 번째 경로 요소를 제거하여 얻은 경로 이름에 대해 동일한 작업을 반복합니다. 등.

코드에서 두 대체 항목을 바꾸면 동일한 결과를 얻지만 순서는 다릅니다.

/this/is/a/test
/is/a/test
/a/test
/test
/this/is/a
/is/a
/a
/this/is
/is
/this

답변2

질문의 본문은 두 가지 다른 것을 요구하는 것 같습니다. 이는 설명된 정규식과 일치하는 상대 URL 경로처럼 보이는 입력 파일에서 무엇이든 추출하는 첫 번째 문제를 해결합니다.

사용 grep:

grep -Eio "(/[a-z0-9_-]+)+" file.html

관련 정보