sedを使用して複数行HTMLコメントを削除する

sedを使用して複数行HTMLコメントを削除する

これは私が思いついたものですが、複数行では機能しません。

sed -i '/<!-- my comment -->.*<!-- \/my comment end -->/d' my_file

ベストアンサー1

sedデフォルトモードは1行ずつ実行されるため、混乱するアプローチの1つは、内容を\x00入力する前に改行文字を別の文字(NULL文字など)に置き換えることですsed

tr '\n' '\x00' <my_file

sedその後、コンテンツを行として処理します。しかし、

sed -e 's/<!-- my comment -->.*<!-- \/my comment end -->//'

の貪欲な一致特性のために動作しませんsed。コメントのすべての内容を最初の文字まで一致させることで非欲張りな一致を達成できますが、これはHTMLコメントに私たちが想定できない文字(特に他のHTMLタグ)を含めることが許可されてい<ない場合にのみ機能します。<

この問題を解決するには、シーケンスを<!ファイル内の他の場所では使用されていない単一文字に変換して、非欲張りな一致を構成できます。\x01この目的のために特殊文字を選択し、貪欲<!でない一致の後にその特殊文字に再変換します。

sed -e $'s/<!/\x01/g' -e $'s/\x01-- my comment -->[^\x01]*\x01-- \/my comment end -->//g'

(リテラルシングルバイト文字\ x01をに渡す$''のではなく、シェル構文を使用してください)''sed

3番目のステップでは、NULL文字が改行文字に変換されます。

tr '\x00' '\n'

最後に、空行は他の呼び出しによって抑制されますsed

sed -e '/^$/d'

つまり、

tr '\n' '\x00' <my_file |sed -e $'s/<!/\x01/g' -e $'s/\x01-- my comment -->[^\x01]*\x01-- \/my comment end -->//g' |tr '\x00' '\n'|sed -e '/^$/d'

awk代わりに別のツール(またはperlシングルライナー)を使用することを選択した場合は、次のsedようなエレガントなソリューションがあります。

perl -0pe 's/<!-- my comment -->.*?<!-- \/my comment end -->//gs' my_file

おすすめ記事