无法使用sed进行分组

时间:2012-08-11 01:22:42

标签: regex sed grouping backreference parentheses

这可以按预期工作:

INPUT FILE src.txt:

ffmpeg -i uno.3gp
ffmpeg -i dos.3gp
ffmpeg -i tres.3gp

命令:

sed 's/-i .*\./XXX/' <src.txt

结果如预期:

ffmpeg XXX3gp
ffmpeg XXX3gp
ffmpeg XXX3gp

然后为什么不按预期进行这些工作:

命令:

sed 's/-i (.*)\./XXX/' <src.txt

预期:

ffmpeg XXX3gp
ffmpeg XXX3gp
ffmpeg XXX3gp

实际结果:

ffmpeg -i uno.3gp
ffmpeg -i dos.3gp
ffmpeg -i tres.3gp

命令:

sed 's/-i (.*)\.3gp/\1.mp3/' <src.txt

预期:

ffmpeg uno.mp3
ffmpeg dos.mp3
ffmpeg tres.mp3

实际结果

sed: -e expression #1, char 18: invalid reference \1 on `s' command's RHS

括号似乎不适用于分组,但我发现的所有教程和示例似乎都认为它们应该......

2 个答案:

答案 0 :(得分:5)

在经典sed(不是GNU sed)中,分组命令使用\(\)(并且计数使用\{和{{1而不是未转义。

因此,您应该尝试:

\}

或者,如果你有GNU sed 's/-i \(.*\)\./XXX/' <src.txt sed 's/-i \(.*\)\.3gp/\1.mp3/' <src.txt ,请添加sed-r以“在脚本中使用扩展正则表达式”(引自--regexp-extended)。< / p>

sed --help

答案 1 :(得分:2)

正如Jonathan Leffler在回答有关错误的来源时,我想提一下,反向引用并不总是好事,有时它会让脚本变慢。

此外,在您的情况下,根本不需要反向引用:

sed 's/-i //;s/\.3gp/.mp3/' <src.txt 

将完成这项工作。