2017-01-02 68 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