![如何使用“sed”在 bash 上替换多行 xml 内容中的 xml 标签](https://linux22.com/image/1191750/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E2%80%9Csed%E2%80%9D%E5%9C%A8%20bash%20%E4%B8%8A%E6%9B%BF%E6%8D%A2%E5%A4%9A%E8%A1%8C%20xml%20%E5%86%85%E5%AE%B9%E4%B8%AD%E7%9A%84%20xml%20%E6%A0%87%E7%AD%BE.png)
我想用 来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
可以选择文件内两个模式之间的所有行(包括两PAT1
行PAT2
)并像这样替换它们:
sed '/PAT1/,/PAT2/c \REPLACEMENT' file
REPLACEMENT
是文本,其中每个嵌入的换行符前面都有一个反斜杠。
请注意,如果PAT1
或PAT2
包含前斜杠/
,则每个斜杠都必须用反斜杠转义\/
,或者必须将分隔符更改为除和之外的其他内容,在这种情况下,当使用该命令或任何其他命令/
时,您需要对每个分隔符序列中的第一个进行转义,例如,您可以将分隔符更改为如下形式: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>
请注意,如果您想就地编辑原始文件,则需要使用sed
s 选项...先在不使用此选项的情况下进行测试,然后将其与备份后缀一起使用,例如,以使用扩展名保存原始文件的备份副本,如下所示:-i
-i.back
.back
file.back
sed -i.back '/PAT1/,/PAT2/c \REPLACEMENT' file
还要注意的是,有专门用于编辑 XML 文件的工具,您可以使用它们来更新、删除或插入 XML 元素...参见如何替换多个 XML 文件中的多个字段?作为一个例子...然而,这些工具可能需要比某些用例(例如您的用例)所需的更复杂的命令脚本sed
...我理解您为什么要求sed
解决方案,并且我自己sed
也更喜欢使用专门的 XML 工具来完成这样的任务...sed
当然,它的可移植性更强。