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

정규식을 사용한 마크업 구문 분석은 다음과 같습니다.악명 높게 문제가 있는.

샘플 데이터에는 문제가 되지 않지만 태그 속성, 설명 및 기타 위치에 꺾쇠 괄호가 나타날 수 있으므로 from에서 일치하는 정규식을 <신뢰할 >수 없게 됩니다.

마크업 파서를 구현하는 도구를 사용해야 합니다.

예를 들어,판독(버전 >= 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

거의 다 왔습니다. 정규식 일치는 "탐욕적"이므로 >패턴 내에서 닫는 문자가 허용되지 않음을 패턴에 알려야 합니다. 다르게 말하면, [^()]*패턴 내부 부분은 "탐욕스럽게" 가능한 한 많은 텍스트와 일치합니다. >패턴의 이 부분에서 닫기를 제외하도록 패턴에 지시하지 않으면 Regex에서 사용하는 열기 <및 닫기 >가 반드시 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/ [^ ]*$//'

이는 xmlstarletHTML 조각을 올바른 형식의 HTML 문서로 변환하는 데 사용됩니다(첫 번째 명령). 그런 다음 각 노드의 값을 추출합니다 li(두 번째 명령). 마지막으로 HTML 엔터티( &amp;예:)를 디코딩합니다. 마지막 sed명령은 각 줄의 마지막 공백 뒤의 모든 항목을 삭제합니다(출력에 포함되어서는 안 되는 괄호 안의 숫자가 있습니다).

문제의 문서에 제공된 출력은 다음과 같습니다.

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

관련 정보