これは私が思いついたものですが、複数行では機能しません。
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