首页 > 解决方案 > 如何使用 sed 编辑 XML 数据文件的特定标签?

问题描述

我的 XML 代码如下

<root>
    <list>
        <pair name="id" Value="randomvalue" />
    </list>
    <list>
        <pair name="place" Value="US" />
    </list>
</root>

我需要将对标签(其名称属性为“id”)的值(可以是我们不知道的任何值)更改为“其他值”。

我试过使用: sed -i 's|<pair name="id" Value="[a-zA-Z0-9_]+" />$|<pair name="id" Value="othervalue" />|g' file.xml

但它不起作用

标签: xmlshellsed

解决方案


sed就像涉及 XML 的情况一样,在这里使用是错误的。使用本机理解格式的工具,例如xmlstarlet。它的多种模式之一允许您为匹配 XPath 表达式的属性或元素分配新值(与尝试使用正则表达式相比,这是匹配 XML 文档的一部分的更好和更精确的方法):

$ xmlstarlet ed -u '/root/list/pair[@name="id"]/@Value' -v othervalue file.xml
<?xml version="1.0"?>
<root>
  <list>
    <pair name="id" Value="othervalue"/>
  </list>
  <list>
    <pair name="place" Value="US"/>
  </list>
</root>

xmlstarlet ed中,-u xpath表示“更新与给定 XPath 表达式匹配的位”并-v blah表示“使用此值”。

添加--inplace选项以在您验证 XML 文件执行正确后就地修改它:

xmlstarlet ed --inplace -u '/root/list/pair[@name="id"]/@Value' -v othervalue file.xml

推荐阅读