快速摘要:我需要创建一个bash脚本来改变每周自动节点内的文本。 该脚本将匹配节点和替换文本内他们(如果可能的话)? 我会怎么做呢?
龙摘要:我是主持人其中有商店,每个在/ ShowcaseStandalone / FFS存储/目录下自己的.xml文件一个的Minecraft服务器。 每个星期天我的服务器重新启动并执行多个命令到终端重置几件事情。 我试图做出改变的一件事是的商店之一。 我想改变的节点<itemstack>和节点<价格>中的文本。 我只是想采取从不同的文件夹中的.txt文件的文本,并将其插入到该节点。 问题是,在节点文本将每周更换。 有什么办法来取代使用bash两个节点中的特定线条或文字?
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
编辑XML
文件中的shell
是这样的:
xmlstarlet edit -L -u "/scs-shop/price[@type='double']" -v '99.66' file.xml
注意
-
"/scs-shop/price[@type='double']"
是一个的Xpath表达式 - 看到
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
是更换与所匹配的文本。 \1
指的是第一个匹配的括号基,其是开口的价格标签。 $PRICE
是与它所需的价格变量。 \2
指的是第二个括号组,在这种情况下,结束标记。
我没有为xmlstarlet的奢侈品。 我发现,虽然只是一个解决方案通过做在线更换;
模板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>