如何使用 sed 编辑 XML 数据文件的特定标签?

Posted

技术标签:

【中文标题】如何使用 sed 编辑 XML 数据文件的特定标签?【英文标题】:How do I edit a specific tag of an XML datafile using sed? 【发布时间】:2021-10-07 16:04:50 【问题描述】:

我的 XML 代码如下

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

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

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

但它不起作用

【问题讨论】:

顺便说一句,您遇到的一个问题是,在sed 默认使用的POSIX 基本正则表达式语法中,+ 不是特殊标记。 “我如何使用 sed 编辑 [...] XML?” 你不会!您应该使用 XML 解析器。 【参考方案1】:

sed、as is almost always the case 在涉及 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

【讨论】:

感谢您的回答。除了 xmlstarlet 没有其他命令可以解决这个问题吗? 可能,但 xmlstarlet 是从脚本或命令行处理 XML 的一个非常流行的选择。

以上是关于如何使用 sed 编辑 XML 数据文件的特定标签?的主要内容,如果未能解决你的问题,请参考以下文章

Linux三剑客(sed)-编辑匹配到的文本

使用 awk 编辑特定标签下的值

如何仅从 xml 文件中提取特定部分并合并它们?

如何循环多个子文件夹并根据特定的 XML 标签重命名文件?

Linux--sed命令

编辑目录中的XML文件