就地 sed 命令不起作用

RTF*_*RTF 3 regex sed

使用 GNU Sed,我总是在就地替换方面遇到一些麻烦。在这种情况下,我试图从如下所示的 xml 条目中删除一些逗号:

<address>T/A Business Name, 74, Address Line 1, Some Town, Some City</address>
Run Code Online (Sandbox Code Playgroud)

...特别是地址号后的逗号(例如 74)需要删除。所以我正在使用这样的东西:

sed -nr 's!(<address>T/A\s+.*?,\s*[0-9]+\s*),(.*</address>)!\1\2! p'
Run Code Online (Sandbox Code Playgroud)

并打印出将完全按照我的预期更改的行,即删除地址号后的逗号。但是当我更改命令以实际对文件进行就地更改时,如下所示:

sed -ir 's!\(<address>T/A\s+.*?,\s*[0-9]+\s*\),\(.*</address>\)!\1\2!'
Run Code Online (Sandbox Code Playgroud)

但是命令什么也不做。没有进行任何更改,但它是完全相同的命令,除了这次我必须转义捕获括号,否则我会为每个匹配行出现错误,例如:

sed: -e expression #1, char 62: invalid reference \2 on `s' command's RHS
Run Code Online (Sandbox Code Playgroud)

Avi*_*Raj 5

你也可以试试这个

sed -ri 's~^(.*Name, [0-9]+),(.*)$~\1\2~g' file
Run Code Online (Sandbox Code Playgroud)

不要在 sed-i之前使用-r。如果这样做,它会显示如上所示的错误消息。

例子:

$ cat aa
<address>T/A Business Name, 74, Address Line 1, Some Town, Some City</address>

$ sed -r 's~^(.*Name, [0-9]+),(.*)$~\1\2~g' aa
<address>T/A Business Name, 74 Address Line 1, Some Town, Some City</address>
Run Code Online (Sandbox Code Playgroud)

  • 所以只是重申一下,我不得不转义就地版本的括号,因为我没有使用任何扩展的正则表达式标志 - 它被解释为 -i 标志的参数(备份文件 - 它解释了所有 .xmlr正在生成文件)。谢谢你们。 (2认同)