sed HTML解析

sed HTML解析

<2つの括弧(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>

すべてのテキストは1行にあります。今私がやっているすべての代替は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

関連情報