如何使用“sed”在 bash 上替换多行 xml 内容中的 xml 标签

如何使用“sed”在 bash 上替换多行 xml 内容中的 xml 标签

我想用 来sed替换 上的 XML 标签bash

以下是用于测试的示例 xml 内容:

<xml-content>
<validation>
<timeout>2880</timeout>
<subject>example</subject>
<required>true</required>
</validation>
</xml-content>

我想替换标签validation

<validation>
<timeout>2880</timeout>
<subject>example</subject>
<required>true</required>
</validation>

使用新标签other-tag

<other-tag>
<hello/>
<more>false</more>
</other-tag>

最终的预期结果如下:

<xml-content>
<other-tag>
<hello/>
<more>false</more>
</other-tag>
</xml-content>

如何通过单个命令行完成此操作sed

答案1

sed可以选择文件内两个模式之间的所有行(包括两PAT1PAT2)并像这样替换它们:

sed '/PAT1/,/PAT2/c \REPLACEMENT' file

REPLACEMENT是文本,其中每个嵌入的换行符前面都有一个反斜杠。

请注意,如果PAT1PAT2包含前斜杠/,则每个斜杠都必须用反斜杠转义\/,或者必须将分隔符更改为除和之外的其他内容,在这种情况下,当使用该命令或任何其他命令/时,您需要对每个分隔符序列中的第一个进行转义,例如,您可以将分隔符更改为如下形式:c \sed_

sed '\_PAT1_,\_PAT2_c \REPLACEMENT' file

因此你可以这样做:

sed '/<validation>/,/<\/validation>/c \<other-tag>\n<hello/>\n<more>false</more>\n</other-tag>' file

编辑此内容:

<xml-content>
<validation>
<timeout>2880</timeout>
<subject>example</subject>
<required>true</required>
</validation>
</xml-content>

更改为:

<xml-content>
<other-tag>
<hello/>
<more>false</more>
</other-tag>
</xml-content>

请注意,如果您想就地编辑原始文件,则需要使用seds 选项...先在不使用此选项的情况下进行测试,然后将其与备份后缀一起使用,例如,以使用扩展名保存原始文件的备份副本,如下所示:-i-i.back.backfile.back

sed -i.back '/PAT1/,/PAT2/c \REPLACEMENT' file

还要注意的是,有专门用于编辑 XML 文件的工具,您可以使用它们来更新、删除或插入 XML 元素...参见如何替换多个 XML 文件中的多个字段?作为一个例子...然而,这些工具可能需要比某些用例(例如您的用例)所需的更复杂的命令脚本sed...我理解您为什么要求sed解决方案,并且我自己sed也更喜欢使用专门的 XML 工具来完成这样的任务...sed当然,它的可移植性更强。

相关内容