使用GNU Sed,我总是在就地替换方面遇到一些麻烦。在这种情况下,我试图从xml条目中删除一些逗号:
<address>T/A Business Name, 74, Address Line 1, Some Town, Some City</address>
...特别是需要删除地址编号(例如74)后的逗号。所以我使用这样的东西:
sed -nr 's!(<address>T/A\s+.*?,\s*[0-9]+\s*),(.*</address>)!\1\2! p'
并且打印出的行将完全按照我的预期进行更改,即删除地址编号后的逗号。但是,当我更改命令以实际对文件进行就地更改时,如下所示:
sed -ir 's!\(<address>T/A\s+.*?,\s*[0-9]+\s*\),\(.*</address>\)!\1\2!'
但命令什么也没做。没有进行任何更改,但它是完全相同的命令,除了我这次必须逃避捕获括号,否则我得到每个匹配行的错误,如:
sed: -e expression #1, char 62: invalid reference \2 on `s' command's RHS
答案 0 :(得分:4)
你也可以试试这个,
sed -ri 's~^(.*Name, [0-9]+),(.*)$~\1\2~g' file
在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>
答案 1 :(得分:3)
对于某些版本的sed,当您使用-i
进行就地编辑时,需要指定备份后缀。
在其他版本的sed中,备份后缀是可选的。
在您的情况下,r
被解释为备份后缀(因为它紧跟i
选项)。
从我系统上的sed手册页(Ubuntu 12.04):
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
用法:
sed -i.bak "s/this/that/g" input.txt
这将导致两件事情发生: