""タグ間のテキストを削除します。ここで、 " "は別の行にあります。

""タグ間のテキストを削除します。ここで、 " "は別の行にあります。

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だけがこの最後のソリューションに適しているでしょう。これは、ファイルに区切り文字がない場合は<!--完全にバッファに読み込まれるためです。

関連情報