替换XML文件中的动态内容

替换XML文件中的动态内容,xml,bash,dynamic,text,replace,Xml,Bash,Dynamic,Text,Replace,快速摘要:我需要创建一个Bash脚本,每周自动更改节点内的文本。脚本将匹配节点并替换其中的文本(如果可能)?我该怎么做 详细摘要: 我托管了一个Minecraft服务器,该服务器有商店,每个商店在/ShowcaseStandalone/ffs storage/目录中都有自己的.xml文件。每个星期天,我的服务器都会重新启动,并向终端执行多个命令,以重置多个内容。我正在努力改变的一件事是其中一家商店。我想更改节点中的文本和节点中的文本。我只是想从另一个文件夹中的.txt文件中获取文本,并将其插入到

快速摘要:我需要创建一个Bash脚本,每周自动更改节点内的文本。脚本将匹配节点并替换其中的文本(如果可能)?我该怎么做

详细摘要: 我托管了一个Minecraft服务器,该服务器有商店,每个商店在/ShowcaseStandalone/ffs storage/目录中都有自己的.xml文件。每个星期天,我的服务器都会重新启动,并向终端执行多个命令,以重置多个内容。我正在努力改变的一件事是其中一家商店。我想更改节点中的文本和节点中的文本。我只是想从另一个文件夹中的.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>

查瓦德27
弗里斯努克
329:0
购买
55
487.5
179
-1084.5
0
0
真的
操作系统:Linux Ubuntu 12.04

您可以使用它在
shell
中编辑
XML
文件,如下所示:

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

  • “/scs shop/price[@type='double']”“
    是一个表达式
  • 请参阅
    xmlstarlet ed--help

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

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

sed-i“s/\(\)[^]*\(我没有拥有xmlstarlet的奢侈。 我找到了一个解决方案,虽然只是做了一个内联替换

模板参数.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>

福
酒吧

所以您只想更改scs shop tag中的usid?使用独占的
bash进行XML操作
?为什么要限制自己?@sputnick抱歉,我不得不添加<和>标记,因为这会杀死我的节点,但不,我需要替换节点“itemstack”和“price”中的文本“@Brian Cain有没有其他方法可以从终端执行此操作?因为这些命令都是在服务器关闭时执行的。我建议使用python——您的服务器是否安装了python,或者可以?如果没有,java可能是另一种选择。我不想让您为我完成所有的工作,但我是一个视觉学习者。我如何用它来取代它“55.0”与“25.0”"?如果你给我一个有效的xml,我可以给你完整的语法。你可以这样测试:
xmlstarlet val file.xml
在那里,我修复了它。很抱歉,我是stackoverflow的新手,所以我不知道如何正确格式化。但现在它应该是一个有效的xml文件。工作得很好。非常感谢你!这是错误的方式。你无法实际解析它基于标记的标记语言,如使用Bash、grep、sed、cut等的HTML或XML。请参阅(您知道SO creator的博客网站吗?)这是关于HTML的,但对于XML也是一样的……如果linux附带了一个好的XML工具,比如xmlstarlet,那么我会同意这是错误的方法。在它出现之前,sed是我的首选工具。事实上,你可以在99%的情况下使用sed,包括这一个。我没有说“那不起作用”,但:“那不可靠”。在这样一个简单的情况下,对于某些人来说这似乎“很好”,但当XML使用嵌套标记变得更加复杂时会发生什么?我指的是使事情变得干净的可靠方法。
sudo apt get install xmlstarlet
在这方面不是什么大问题。“但我认为这和要求所有琐碎的HTML处理任务都由成熟的解析引擎来处理一样是错误的“这是您引用的博客文章中的一段话。无论如何,作为记录:我更喜欢xmlstarlet解决方案。但如果xmlstarlet不可用,sed将完成er。@sputnick:apt get install不是那么容易,例如,您需要internet连接和硬盘上的可用空间(如果你使用类似Backtrack的东西,你有一个4GB的ramdisk,如果它已满,它就会崩溃)。最近我的apt系统坏了,我在3个月内无法使用apt get install!那么如何再次更改结果文件?