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
您可以使用xmlstarlet
在shell
编辑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>