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
정규식을 사용한 마크업 구문 분석은 다음과 같습니다.악명 높게 문제가 있는.
샘플 데이터에는 문제가 되지 않지만 태그 속성, 설명 및 기타 위치에 꺾쇠 괄호가 나타날 수 있으므로 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/ [^ ]*$//'
이는 xmlstarlet
HTML 조각을 올바른 형식의 HTML 문서로 변환하는 데 사용됩니다(첫 번째 명령). 그런 다음 각 노드의 값을 추출합니다 li
(두 번째 명령). 마지막으로 HTML 엔터티( &
예:)를 디코딩합니다. 마지막 sed
명령은 각 줄의 마지막 공백 뒤의 모든 항목을 삭제합니다(출력에 포함되어서는 안 되는 괄호 안의 숫자가 있습니다).
문제의 문서에 제공된 출력은 다음과 같습니다.
Mark Yato ft. MarkAm & Givēon - Thuieo
The Central - AHTIOe oie
Taa Too A - ryhwtyw w