这可以按预期工作:
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
括号似乎不适用于分组,但我发现的所有教程和示例似乎都认为它们应该......
答案 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
将完成这项工作。