使用 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)
你也可以试试这个
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)