Sed 在两个字符串之间用特殊字符进行替换

Sed 在两个字符串之间用特殊字符进行替换

我有一个包含代码的 XML 文件,为了将其与 xmllink 一起使用,我需要删除一个链接。

XML 文件包含:

<xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PackingList xmlns="Link to somewhere#">
<morecode></morecode>

使用 sed'sed s/PackingList.*\>/PackingList/g' xmlfile得到以下结果(在第二行):

<PackingList#">

虽然应该

<PackingList>

我究竟做错了什么?

答案1

有三个错误:-

  • 命令中的第一个引号sed应该位于s/选项之前,而不是位于sed其本身之前 - 我认为这是一个输入错误。
  • >字符在正则表达式中没有特殊含义,不能转义 - 该序列\>具有特殊意义:它意味着单词结尾,并且由于是.*“贪婪的”,它会匹配行上最后一个单词的结尾,因此保留#"
  • 如果匹配源>,这将包含在要替换的字符串中,因此它也必须出现在替换字符串中。

因此你的编辑命令应该是:

sed 's/PackingList.*>/PackingList>/g' xmlfile

这与 jherran 的解决方案类似,但考虑到了您最初的匹配尝试。匹配尾随的双引号可能会更简洁:

sed 's/PackingList.*"/PackingList/g' xmlfile

如果您不想依赖贪婪(并使其更具可读性),请使用:

sed 's/PackingList.*".*"/PackingList/g' xmlfile

请注意,同一行上的任何后续 XML 标记都可能被上述任何一项删除:为避免这种情况,请使用:

sed 's/PackingList[^>]*"[^>]*"/PackingList/g' xmlfile

答案2

尝试一下这个方法:

sed 's/PackingList.*/PackingList>/g' xmlfile

相关内容