가능합니까? 많은 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