XML ファイルからコメントを削除するにはどうすればいいですか?

XML ファイルからコメントを削除するにはどうすればいいですか?

XML ファイルからコメントを削除できるコマンド ライン ツールはありますか? それとも、これを行うには XML パーサーを使用する小さなプログラムを作成する必要がありますか?

アップデート: 考えられるすべての XML ファイルのサブセットのみを処理するソリューションには興味がありません。

たとえば、正規表現では XML 解析を処理できません。

https://stackoverflow.com/questions/6751105/why-its-not-possible-to-use-regex-to-parse-html-xml-a-formal-explanation-in-la

答え1

私は次のようにします:

cat myfile.xml | sed '/<!--.*-->/d' | sed '/<!--/,/-->/d' > cleaned.xml

または:

awk 'in_comment&&/-->/{sub(/([^-]|-[^-])*--+>/,"");in_comment=0}
 in_comment{next}
 {gsub(/<!--+([^-]|-[^-])*--+>/,"");
  in_comment=sub(/<!--+.*/,"");
  print}'

または:

xmlstarlet ed -d '//comment()' file.xml

答え2

一番上の回答を拡張します。行全体ではなくコメントのみを削除したい場合は、次のようにするとよいでしょう。

sed 's/<!--.*-->//'

私の場合、コンテンツ全体が 1 行に収まっている縮小された XML ファイルがあり、以前の解決策ではコメントが配置されている行全体が削除されるため、ファイルが完全にクリアされてしまいます。

答え3

これは、xml から複数行のコメント (失敗したテストなど) をクリーンアップするのに便利です。少なくとも、手動で選択した、エンド ユーザーに役立つコメントはクリーンアップします。
perl -i -w -0777pe 's/<!--(.(?<!(HELP|TODO)))*?-->//sg' somefile.xml

関連する正規表現の詳細:https://stackoverflow.com/a/1240293/1422630

xmlstarlet を使用して同じ結果を得る方法があれば、正規表現では処理できない例外が発生する可能性があるため、その方法が好ましいのですが、現時点ではこれを使用する必要があります。

関連情報