2017-01-02 7 views
0

他の動的プロパティに基づいてXML要素値の一部を更新するためのbashスクリプトが必要です。例えばXML要素値の一部を更新するためのBashスクリプト

、XMLファイル:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Configure class="org.eclipse.something"> 
    <Set name="foo">foo-val</Set> 
    <Set name="bar">bar-val</Set> 
    <Set name="my-elm">/dont/matter/THIS_ONE_NEED_TO_BE_UPDATED</Set> 
</Configure> 

はregexingでxmlstarlet使用しようとしましたが、それは私が望む結果を提供していません。 私はOSX 10.12で作業しています。

+2

あなた自身で試しましたか? –

+1

XMLパーサーをチェックしましたか? – fedorqui

+0

変更する値がファイル内に1回しか存在しない場合は、単純な 'sed -i 's/oldvalue/newvalue /' file.xml'で十分です。例えば、 – Aserre

答えて

1

xmlstarletを以下のように使用すると、xpathの表現がうまく機能しました。以下の式は、交換が適切に行われている場合XMLファイル

xmlstarlet edit -L -u "/Configure/Set[@name='my-elm']" -v '/dont/matter/THIS_ONE_NEED_TO_BE_UPDATED' xml-file 

ドロップ-Lフラグのインペース置換(-Lフラグ)をチェックすると、一度成功したが、同じことを追加しません。それは厳密にNOTですがOS X

xmlstarlet (1.6.1)にチェック

xml更新にsedを使用することをお勧め、これはロジックの下にあなたのために働くだろう、

sed "s/\(<Set name=\"my-elm\".*>\)[^<>]*\(<\/Set.*\)/\1\/dont\/matter\/THIS_ONE_NEED_TO_BE_UPDATED\2/" xml-file 

は、インプレース用-i.bakを追加ファイルの置換。

+0

ありがとうございます。それは動作します:) 2つの質問ください。 1)xmlstarletなしでそれを行う方法はありますか?インストールされていないマシンがあります。2)THIS_ONE_NEED_TO_BE_UPDATEDの部分だけを更新する良い正規表現がありますか? – Stas

+0

@StasS:あなたの問題を解決するための私のアップデートを参照してください。 – Inian

関連する問題