sed HTML 파싱

sed HTML 파싱

<두 괄호(HTML 코드 아님) 사이의 텍스트를 다시 또는 으로 변경하려면 HTML을 구문 분석해야 합니다 >.

다음은 교체해야 했던 HTML 코드의 예입니다.

<content:encoded><![CDATA[<div class="pre_headline">some text</div> <p>…. More text . </p><p></p><h2> More text </h2><p> More text < text between angle brackets > … more text
… </content:encoded>

원하는 출력:

<content:encoded><![CDATA[<div class="pre_headline">some text</div> <p>…. More text . </p><p></p><h2> More text </h2><p> More text &lt; text between angle brackets &gt; … more text
… </content:encoded>

모든 텍스트는 한 줄에 있습니다. 지금 내가 하는 모든 대체는 sed 또는 awk를 사용하고 있습니다. 하지만 모든 HTML 태그를 변경하지 않고 텍스트의 대괄호를 바꾸는 방법을 찾을 수 없습니다.

모든 HTML 괄호 뒤에 공백이 오지 않도록 정의하고 싶습니다. 인라인 텍스트 괄호 뒤에는 일반적으로 공백이 옵니다. 이것이 교체해야 할 브래킷을 선택하는 방법일 수 있습니다. 이 방법은 대괄호 안의 공백 없이 텍스트를 바꾸지 않으므로 더 나은 규칙이 있을 수 있습니다.

다음 sed 명령은 모든 괄호를 대체합니다.

sed -e 's/>/\&gt;/g' | 
sed -e 's/</\&lt;/g' |

답변1

이것은 가능하다sed그러나 XML 파서보다 더 어렵습니다.

sed '
:2
#puts open and close tag in one pattern
/\s*<\([^>]*>\).*<\/\1\s*$/!{
    N
    b2
}
#mark pairable tags by `#` symbol
:1
s/\(.*<\)\(\([^#> ]*\).*<\)\/\3/\1#\2#\/\3/
#other variant
#s/\(.*<\)\(\([^><]*\)[^>]*>.*<\/\3\)>/\1#\2#>/
t1
#change non-marked text
s/<\([^#]*\)>/\&lt;\1\&gt;/g
#remove marks
s/#//g
' file.html

관련 정보