如何使用 sed 为每个 XML 节点添加命名空间

How to add a namespace to each XML node with sed

给出以下 XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response xmlns="...">
    <root>
        <test>abc</test>
    </root>
</response>

我需要像这样为每个元素添加一个命名空间:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:response xmlns:ns="...">
    <ns:root>
        <ns:test>abc</ns:test>
    </ns:root>
</ns:response>

sed可以吗?我知道 sed 不是处理 XML...

的最佳工具

可能有嵌套节点,但没有人已经拥有命名空间。最后,没有属性。

有了如此简单的需求描述,您不能做更多的事情了:

sed 's!</\|<!&ns:!g' your_file

代码

  • 使用!作为分隔符,所以/不需要转义;
  • 搜索字符串通过交替 \|;
  • 匹配 </<
  • 替换由匹配的棋子本身组成,&,后跟 ns:
  • 所有这些都是通过 g 在整条线上完成的。

在评论中你说你想跳过以 <?xml 开头的行的提交,但更改 s 命令只会让它变得更长且更难阅读。

由于该行始终且仅是第一行,因此您可以通过在 s 命令前加上 2,$ 来定位除第一行之外的所有行。