awk 또는 sed를 사용하여 < > 사이의 모든 내용을 삭제하세요.

awk 또는 sed를 사용하여 < > 사이의 모든 내용을 삭제하세요.

내 txt 파일에 다음 내용이 있습니다.

<ol><li><b><a href="/page1/Mark_Yato" title="Mark Yato">Mark Yato</a> ft. MarkAm &amp; <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 엔터티( &amp;예:)를 디코딩합니다. 마지막 sed명령은 단순히 각 줄의 마지막 공백 뒤의 모든 항목을 제거합니다(괄호 안의 숫자는 출력의 일부가 되어서는 안 됩니다).

질문에 제공된 문서의 출력:

Mark Yato ft. MarkAm & Givēon - Thuieo
The Central - AHTIOe oie
Taa Too A - ryhwtyw w

관련 정보