就地sed命令不起作用

时间:2014-05-28 18:15:11

标签: regex sed

使用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

2 个答案:

答案 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

这将导致两件事情发生:

  1. input.txt将由sed
  2. 修改就地
  3. input.txt.bak将创建为备份文件