2017-01-02 69 views
0

我需要一個bash腳本根據其他動態屬性更新部分XML元素值。用於更新部分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

如果要更改的值只在文件中出現一次,那麼簡單的'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標誌),以檢查是否更換正確發生,並且一旦成功添加相同。

經過上xmlstarlet (1.6.1)OS X

雖然它是嚴格NOT建議使用sedxml更新,這下面的邏輯會爲你工作,

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

添加-i.bak就地替換文件。

+0

謝謝。它的工作:)請兩個問題。 1)有沒有辦法做到這一點沒有xmlstarlet?有機器沒有安裝它2)是否有一個很好的正則表達式技巧來更新THIS_ONE_NEED_TO_BE_UPDATED部分? – Stas

+0

@StasS:請參閱我的更新應該解決您的問題, – Inian