替换XML文件中的动态内容

Clu*_*cky 19 xml bash text replace dynamic

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

总结: 我主持一个拥有商店的Minecraft服务器,每个商店在/ ShowcaseStandalone/ffs-storage /目录中都有自己的.xml文件.每个星期天我的服务器重新启动并执行几个命令到终端重置几件事.我试图改变的一件事是商店之一.我想要更改节点<itemstack>中的文本和节点<price>中的文本.我只是想从不同文件夹中的.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>
Run Code Online (Sandbox Code Playgroud)

操作系统: Linux Ubuntu 12.04

Gil*_*not 18

您可以使用xmlstarlet以下内容编辑XML文件shell:

xmlstarlet edit -L -u "/scs-shop/price[@type='double']" -v '99.66' file.xml
Run Code Online (Sandbox Code Playgroud)

注意

  • "/scs-shop/price[@type='double']"是一个Xpath表达式
  • 看到 xmlstarlet ed --help


Dan*_*iss 13

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

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

这将取代123的价格.

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

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

\1$PRICE\2是用于替换匹配文本的文本. \1指第一个匹配的括号组,即开盘价标签. $PRICE是具有所需价格的变量. \2指第二个括号组,在这种情况下是结束标记.

  • 这是错误的方式.您无法使用Bash,grep,sed,cut等逼真地解析基于标记的标记语言,如HTML或XML.请参阅http://www.codinghorror.com/blog/archives/001311.html(您知道博客网站来自SO创建者?)这是关于HTML的,但对于XML来说这是相同的...... (4认同)
  • 如果linux附带了一个像xmlstarlet这样的优秀xml工具,那么我会同意这是错误的方法.在此之前,sed是我的首选工具.实际上,你可以在99%的情况下使用sed,包括这个. (2认同)
  • 我不是说“那行不通”,而是说:“那不可靠”。在像这样的简单情况下,这对某些人来说似乎“很好”,但是当 XML 因嵌套标签而变得更加复杂时会发生什么?我说的是使事情变得干净的可靠方法。`sudo apt-get install xmlstarlet` 在那里没什么大不了的。 (2认同)
  • “但我认为这与要求每个琐碎的 HTML 处理任务都由成熟的解析引擎处理一样是错误的”,这是您引用的博客文章中的一句话。无论如何,郑重声明:我更喜欢 xmlstarlet 解决方案。但如果 xmlstarlet 不可用,sed 将完成任务。 (2认同)