
次のような非常に単純な 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 に戻します。awk
sed
2xml
たとえば、この文書を例に挙げると、
<?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>
出力をtidyp
XML フォーマッタである に渡しました。そうしないと、ドキュメントは次のようになります。
<doc><x><z>look ma no hands</z></x><y><z>should NOT be changed</z></y></doc>
...これは文法的には正しいのですが、読みにくくなります。