使用bash脚本替换特定记录ID中的xml中的字段值,还取决于其他键值

时间:2014-08-14 00:48:44

标签: xml bash

我有一个xml文件:

<record name="rfPathProv">
        <key name="pathId" value="1"/>
        <key name="pathDirection" value="RX"/>
        <field name="band" value="4"/>
</record>
<record name="rfPathProv">
        <key name="pathId" value="1"/>
        <key name="pathDirection" value="TX"/>
        <field name="band" value="4"/>
</record>

我只需要使用bash脚本替换记录名=“rfPathProv”和key name =“pathId”value =“1”时的band值。请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:1)

你可以尝试以下,绝不是完美的。在这个例子中,我将波段值改为10。

awk '/<\/record>/{a=0};{
a+=sub(/<record name="rfPathProv">/,"&")
a+=sub(/<key name="pathId" value="1"\/>/,"&")
    if (a==2) {
      sub(/<field name="band" value="[0-9]+"/,"&@")
      sub(/"[0-9]+"@/,"\"10\"")
              }
}1' originalfile > newfile

答案 1 :(得分:0)

这确实是一个xpath问题。使用xmlstarlet,您可以

xmlstarlet ed -u '//record[@name="rfPathProv" and ./key[@name="pathId" and @value="1"]]/field[@name="band"]/@value' -v 'newValue' file.xml > newfile.xml

输出(在为样本xml提供顶级节点之后)

<?xml version="1.0"?>
<records>
  <record name="rfPathProv">
    <key name="pathId" value="1"/>
    <key name="pathDirection" value="RX"/>
    <field name="band" value="newValue"/>
  </record>
  <record name="rfPathProv">
    <key name="pathId" value="1"/>
    <key name="pathDirection" value="TX"/>
    <field name="band" value="newValue"/>
  </record>
</records>