シンプルな XML ファイルを更新する CLI コマンド

シンプルな XML ファイルを更新する CLI コマンド

次のような非常に単純な XML 構成ファイル内の文字列をプログラムで更新したいと思います。

<?xml version="1.0"?>
<x>
    <z>should be changed</z>
</x>
<y>
    <z>should NOT be changed</z>
</y>

x/z を更新し、 y/z を更新しない簡単な CLI コマンドは存在しますか? 次のような XPath セレクター引数を使用することもできます。

$ xml-update myfile.xml /x/z "my new string"

Perl や Python で何かを書くこともできますが、この問題の単純さを考えると、これを実行できる巧妙な Unix ユーティリティがすでに存在しているに違いないと思います。

アップデート: これを見つけましたが、ちょっとやりすぎのようです。まず XSLT を学ばなければなりません。http://developerblog.redhat.com/2013/12/05/xml-editing-bash-script/

答え1

あなたはxml2/2xmlあまり手間をかけずにコマンドラインで XML を処理するツールです。XML ドキュメントを、やxml2などの従来のテキスト処理ツールでの使用に適した行指向の形式に変換し、この形式を取得して XML に戻します。awksed2xml

たとえば、この文書を例に挙げると、

<?xml version="1.0"?>
<doc>
<x>
    <z>should be changed</z>
</x>
<y>
    <z>should NOT be changed</z>
</y>
</doc>

xml2そのコンテンツを実行すると、次の結果が得られます。

$ xml2 < doc.xml
/doc/x/z=should be changed
/doc/y/z=should NOT be changed

要素の内容を<z>次のように変更できます

xml2 < doc.xml |
sed '/\/doc\/x\/z/ s/should be changed/look ma no hands/' |
2xml | tidyp -xml -i -q

検索式を使用して、sedで始まる行を明示的に検索し/doc/y/z、その行の内容を変更します。次のようになります。

<doc>
  <x>
    <z>look ma no hands</z>
  </x>
  <y>
    <z>should NOT be changed</z>
  </y>
</doc>

出力をtidypXML フォーマッタである に渡しました。そうしないと、ドキュメントは次のようになります。

<doc><x><z>look ma no hands</z></x><y><z>should NOT be changed</z></y></doc>

...これは文法的には正しいのですが、読みにくくなります。

関連情報