![awk 또는 sed를 사용하여 < > 사이의 모든 내용을 삭제하세요.](https://linux55.com/image/192045/awk%20%EB%98%90%EB%8A%94%20sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%26lt%3B%20%26gt%3B%20%EC%82%AC%EC%9D%B4%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EB%82%B4%EC%9A%A9%EC%9D%84%20%EC%82%AD%EC%A0%9C%ED%95%98%EC%84%B8%EC%9A%94..png)
내 txt 파일에 다음 내용이 있습니다.
<ol><li><b><a href="/page1/Mark_Yato" title="Mark Yato">Mark Yato</a> ft. MarkAm & <a href="/page1/Giv%C4%93on" title="Givēon">Givēon</a> - <a href="/page1/Mark_Yato:Thuieo" title="Mark Yato:Thuieo">Thuieo</a> (7)</b></li>
<li><b><a href="/page1/The_Central" title="The Central">The Central</a> - <a href="/page1/The_Central:AHTIOe oie" title="The Central:AHTIOe oie">AHTIOe oie</a> (7)</b></li>
<li><b><a href="/page1/Taa_Too_A" title="Taa Too A">Taa Too A</a> - <a href="/page1/Taa_Too_A:ryhwtyw w" title="Taa Too A:ryhwtyw w">ryhwtyw w</a> (8)</b></li>
그리고 다음과 같이 출력되도록 시도했습니다.
Mark Yato ft. MarkAm & Givēon - Thuieo
The Central - AHTIOe oie
Taa Too A - ryhwtyw w
이를 달성하기 위해 "<", ">"와 그 사이의 모든 항목을 제거하여 얻고 싶은 목록만 남도록 해야겠다고 생각했습니다.
다음 sed 명령을 시도했습니다.
sed 's/<[^()]*>//g'
그러나 이는 다음과 같은 결과만 출력합니다.
(7)
(7)
(8)
내가 무엇을 잘못하고 있으며 sed 명령을 수정하거나 더 적합한 경우 어떻게 awk로 변환할 수 있습니까?
답변1
정규식을 사용하여 태그를 구문 분석하는 것은악명 높게 문제가 있는.
샘플 데이터에서는 문제가 되지 않지만 레이블 속성, 설명 및 기타 위치에 꺾쇠 괄호가 나타날 수 있으며 이로 인해 정규식 일치가 <
신뢰할 수 없게 됩니다 >
.
태그 파서를 구현하는 도구를 사용해야 합니다.
예를 들어판독(버전 >= 2.8) 예제 데이터를 사용합니다(누락된 </ol>
라벨을 추가하지 않음).
$ pandoc -f html -t plain file
Mark Yato ft. MarkAm & Givēon - Thuieo (7)
The Central - AHTIOe oie (7)
Taa Too A - ryhwtyw w (8)
그런 다음 이 출력을 일반 텍스트로 쉽게 후처리하여 빈 줄과 기타 원치 않는 부분을 제거할 수 있습니다.
$ pandoc -f html -t plain file |
sed -e '/^$/d' -e 's/[[:blank:]]*([[:digit:]]*)$//'
Mark Yato ft. MarkAm & Givēon - Thuieo
The Central - AHTIOe oie
Taa Too A - ryhwtyw w
버전 2.8 이전에는 pandoc
형식화된 출력을 생성할 때 강조된 텍스트를 모두 대문자로 변환하는 데 사용되었습니다 plain
. 목록 항목의 태그는 <b>
이 동작을 트리거합니다(자세한 내용은 참조).변경 로그또는 관련범죄GitHub에서).
실제 입력 데이터에 따라 해결 방법은 다음 markdown
과 같은 입력 형식을 명시적으로 사용하는 것일 수 있습니다.pandoc
pandoc -f markdown -t plain file
pandoc
또는 자동으로 기본값이 ( )로 설정된다는 점을 암묵적으로 고려하세요 pandoc -t plain file
.
답변2
거의 다 왔습니다. 정규식 일치는 "탐욕적"이므로 >
패턴 내에서 종료 문자가 허용되지 않음을 패턴에 알려야 합니다. 즉, [^()]*
패턴 내의 부분은 가능한 한 많은 텍스트와 "탐욕스럽게" 일치합니다. 패턴의 이 부분에서 닫는 단어를 제외하도록 패턴에 지시하지 않으면 >
정규식은 HTML 관점에서 반드시 짝을 이루지 않는 시작 단어 <
와 끝 단어를 사용합니다.>
대신 이것을 사용하십시오:
sed -e 's/<[^>]*>//g'
<
이렇게 하면 정규식이 끝 부분과 사이에 있는 더 큰 텍스트 블록을 제거하는 대신 각 HTML 태그를 제거하도록 강제됩니다 .>
<
>
답변3
php
다음을 사용하여 모든 HTML 태그를 제거하고 HTML 엔터티를 다시 일반 문자로 변환할 수 있습니다 .
$ <file php -r 'echo htmlspecialchars_decode(strip_tags(file_get_contents("php://stdin")), ENT_HTML5);'
Mark Yato ft. MarkAm & Givēon - Thuieo (7)
The Central - AHTIOe oie (7)
Taa Too A - ryhwtyw w (8)
추가로 공백(공백, 탭), 시작 (
, 하나 이상의 숫자 및 )
다음으로 끝나는 줄의 끝을 제거하려면 sed
:
$ <file php -r 'echo htmlspecialchars_decode(strip_tags(file_get_contents("php://stdin")), ENT_HTML5);' |
sed 's/[[:blank:]]*([[:digit:]][[:digit:]]*)$//'
Mark Yato ft. MarkAm & Givēon - Thuieo
The Central - AHTIOe oie
Taa Too A - ryhwtyw w
답변4
사용 xmlstarlet
:
xmlstarlet fo -H file |
xmlstarlet sel -E latin1 -t -v '//li' -nl 2>/dev/null |
xmlstarlet unesc | sed 's/ [^ ]*$//'
xmlstarlet
이는 HTML 조각을 올바른 형식의 HTML 문서로 변환하는 데 사용됩니다 (첫 번째 명령). 그런 다음 각 노드의 값을 추출합니다 li
(두 번째 명령). 마지막으로 HTML 엔터티( &
예:)를 디코딩합니다. 마지막 sed
명령은 단순히 각 줄의 마지막 공백 뒤의 모든 항목을 제거합니다(괄호 안의 숫자는 출력의 일부가 되어서는 안 됩니다).
질문에 제공된 문서의 출력:
Mark Yato ft. MarkAm & Givēon - Thuieo
The Central - AHTIOe oie
Taa Too A - ryhwtyw w