td.txt
次の内容を含むテキストファイルがあります。
More here || <--field="data.com":CHK test text--> || test 2 test x @ --
||<!-- more data
here --> ||
echo "||<!--field="data.com":CHK test text-->|| test 2 test x @ -- ||<--field="data.com":CHK more data here -->|| test data
すべてのインスタンスを削除したいです。<!-- and all text inside the tags -->
sed
このような表現があります。cat td.txt | sed 's/<!--[^P]*-->//g'
必要に応じてタグとその内容を削除しますが、<!--
タグが1行で始まり別の行で終わる場合は削除されません-->
。
上記の式を使った結果は
More here || <--field="data.com":CHK test text--> || test 2 test x @ --
||<!-- more data
here --> ||
echo "|||| test data
見せる
<!-- more data
here -->
タグがまだ存在しています
<!-- and all text inside the tags -->
とのすべてのインスタンスを削除する方法
<!-- and all text
inside the tags -->
sed、grep、または他のツールを使用していますか?
答え1
XML文書からコメントを削除するには、次のものを使用できますxmlstarlet
。
xmlstarlet ed -d '//comment()' file.xml
コメントが複数行にまたがるかどうかは重要ではありません。
このツールはxmlstarlet
()オプションによる内部編集をサポートしています。-L
--inplace
答え2
私は以下を使用しますperl
:
perl -0777 -pe 's/<!--.*?-->//sg' < your-file
ここで-p
このsed
モードを有効にすると、-0777
レコード区切り文字を不可能な文字に変更します。これは、ファイル全体が1つのレコード(スロープモード)として扱われ、s///sg
正規表現に一致するすべての項目を<!--.*?-->
空の文字に置き換えることを意味します。このs
フラグは.
改行文字とも一致し、g
これが初めてではありません。
入力をXMLに解析しないため、入力が有効なXMLであるかどうかは問題ではないため、入力が有効なXMLでない場合にも機能しますが、理論的には、次の場合にその項目を削除することができます<!--
。そのうちのいくつかは-->
XMLコメントではありません。<!CDATA[
を使用すると、sed
次のことができます。
sed ':1
$!{
N;b1
}
s/_/_u/g; s/(/_</g; s/)/_>/g; # escape _, ( and ) characters
s/<!--/(/g; s/-->/)/g; # replace <!-- and --> with
# single characters ( and )
s/([^)]*)//g; # remove the comments
s/)/-->/g; s/(/<!--/g; # revert earlier replacement
s/_>/)/g; s/_</(/g; s/_u/_/g; # revert earlier escaping'
標準にはPerlの演算子(貪欲ではないバージョン)sed
がないので、withとで置き換えるのではなく、自分と文字を元の(そして)として入力してください。*?
*
([^)]*)
(
)
)
<!--
(
-->
)
(
)
_<
_>
_
_u
入力全体を事前にパターンスペースに吸い込むループに注意してください(一部のsed
実装ではパターンスペースサイズの下限がありますが、GNUではありませんsed
)。
答え3
sed '/<!--/!b;:1;/-->/!{N;b1};s/-->/\a/;s/<!--.*\a//' file
ラベルが表示されたら<!--
ラベルがあるかどうかを確認し-->
、それ以外の場合はバッファに行を追加してラベル1を返します。最初の-->
ラベルをテキストファイルにない文字で置き換えます。ラベルからアンカーまで削除します。\r
\f
\a
<!--
タスクを複雑にしましょう。複数の検索タグが 1 行に同時に表示できるとします。
awk 'NR>1 {sub(/-->/,"\r"); sub(/.*\r/, "")}1' RS='<!--' ORS= file
おそらく、GNU awkだけがこの最後のソリューションに適しているでしょう。これは、ファイルに区切り文字がない場合は<!--
完全にバッファに読み込まれるためです。