3

正規表現 (awk、sed、grep...) を使用して bash の XML コメントを削除したいのですが、これに関する他の質問を見てきましたが、何かが欠けています。これが私のxmlコードです

<Table>
    <!--
   to be removed bla bla bla bla bla bl............

    removeee

    to be removeddddd
    -->

<row>
        <column name="example"  value="1" ></column>
    </row>
</Table>

だから私は2つのxmlファイルを比較していますが、コメントを考慮して比較したくありません。私はこれをします

diff file1.xml file2.xml | sed '/<!--/,/-->/d'

ただし、それはで始まる行<!--と最後の行のみを削除します。間にあるすべての行を削除するわけではありません。

4

6 に答える 6

6

最後に、クライアント/友人/インストラクターに、ある種の XML プロセッサをインストールする必要があることを勧める必要があります。xmlstarletは優れたコマンド ライン ツールですが、任意の標準 Unix 用に、そしてほとんどの場合 Windows 用にコンパイルできる XSLT の実装はいくつでも (または少なくとも 2 より大きいいくつか) あります。実際、正規表現ベースのツールでは多くの XML 処理を行うことはできません。何を行うにしても、読みにくく、保守が難しく、まれなケースで失敗する可能性が高く、時には悲惨な結果を招く可能性があります。

私は次の小さな awk プログラムを磨き上げたり見直したりするのに多くの時間を費やしていません。準拠した xml ドキュメントからコメントが削除されると思います。次のコメントは準拠していないことに注意してください。

<!-- XML comments cannot include -- so this comment is illegal -->

私のスクリプトでは正しく処理されません。

以下も違法ですが、実際に見たことがあり、対処するのは難しくなかったので、そうしました:

<!-------------- This comment is ill-formed but... -------------->

ここにあります。保証はありません。読みにくいことはわかっているので、維持したくありません。任意のコーナーケースでは失敗する可能性があります。

awk 'in_comment&&/-->/{sub(/([^-]|-[^-])*--+>/,"");in_comment=0}
     in_comment{next}
     {gsub(/<!--+([^-]|-[^-])*--+>/,"");
      in_comment=sub(/<!--+.*/,"");
      print}'
于 2013-10-07T19:21:43.193 に答える
3
xmlstarlet ed -d '//comment()' file.xml
于 2013-10-07T18:03:16.753 に答える