replaceXML文件中的dynamic内容

快速总结:我需要创build一个Bash脚本来每周自动更改节点内的文本。 该脚本将匹配节点并replace其中的文本(如果这是可能的)? 我将如何做到这一点?

总结:我托pipe了一个有商店的Minecraft服务器,每个商店在/ ShowcaseStandalone / ffs-storage /目录下都有自己的.xml文件。 每个星期天我的服务器重新启动,并执行几个命令到terminal重置几件事情。 我试图改变的一件事是商店之一。 我想要更改节点<itemstack>中的文本和节点<price>中的文本。 我只是想从另一个文件夹中的.txt文件中获取文本,并将其插入到该节点中。 问题是,节点中的文本每周都会改变。 有什么方法可以用bashreplace两个节点中的特定行或文本吗?

XML文件:

<?xml version="1.0" encoding="UTF-8"?> <scs-shop usid="cac8480951254352116d5255e795006252d404d9" version="2" type="storage"> <enchantments type="string"/> <owner type="string">Chadward27</owner> <world type="string">Frisnuk</world> <itemStack type="string">329:0</itemStack> <activity type="string">BUY</activity> <price type="double">55.0</price> <locX type="double">487.5</locX> <locY type="double">179.0</locY> <locZ type="double">-1084.5</locZ> <amount type="integer">0</amount> <maxAmount type="integer">0</maxAmount> <isUnlimited type="boolean">true</isUnlimited> <nbt-storage usid="23dffac5fb2ea7cfdcf0740159e881026fde4fa4" version="2" type="storage"/> </scs-shop> 

操作系统: Linux Ubuntu 12.04

您可以使用xmlstarletshell编辑XML文件,如下所示:

 xmlstarlet edit -L -u "/scs-shop/price[@type='double']" -v '99.66' file.xml 

注意

  • "/scs-shop/price[@type='double']"是一个Xpathexpression式
  • 请参阅xmlstarlet ed --help

XML方式很酷,但如果您需要使用普通的bash工具,则可以使用sed修改一行。 例如:

 PRICE=123 sed -i "s/\(<price.*>\)[^<>]*\(<\/price.*\)/\1$PRICE\2/" $XML_FILE_TO_MODIFY 

这将用123代替价格。

这个sed命令似乎令人望而生畏,所以让我分解一下:

\(<price.*>\)[^<>]*\(<\/price.*\)是要匹配的模式。 \(\)是分组的括号。 <price.*>匹配开盘价格标签。 [^<>]*匹配除括号之外的任何内容,在这种情况下,将与价格标签的内容匹配。 <\/price.*匹配价格标签的结尾。 正斜杠在sed中是一个分隔符,所以我用一个反斜杠来转义它。

\1$PRICE\2是用来replace匹配文本的文本。 \1是指第一个匹配的括号组,即开盘价格标签。 $PRICE是具有期望价格的variables。 \2是指第二个括号组,在这种情况下是结束标记。

我没有xmlstarlet的奢侈。 我简单地通过在线replace来find解决scheme;

模板parameter.xml

 <ns:Parameter> <ns:Name required="true">##-ParamName-##</ns:Name> <ns:Value> <ns:Text>##-ParamValue-##</ns:Text> </ns:Value> </ns:Parameter> 

片段

 tokenName="foo" tokenValue="bar" #Replace placeholders in parameter template element myParamElement=$(cat template-parameter.xml) myParamElement=${myParamElement//##-ParamName-##/$tokenName} myParamElement=${myParamElement//##-ParamValue-##/$tokenValue} 

结果

 <ns:Parameter> <ns:Name required="true">foo</ns:Name> <ns:Value> <ns:Text>bar</ns:Text> </ns:Value> </ns:Parameter>