1

这按预期工作:

输入文件 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

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

4

2 回答 2

5

在 Classic 中sed(不一定是 GNU sed),分组命令使用\(and \)(计数使用\{and \})而不是未转义。

因此,您应该尝试:

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

或者,如果您有 GNU sed,请添加-r--regexp-extended“在脚本中使用扩展的正则表达式”(引用自sed --help)。

sed -r 's/-i (.*)\./XXX/' <src.txt
sed -r 's/-i (.*)\.3gp/\1.mp3/' <src.txt
于 2012-08-11T01:29:16.177 回答
2

正如 Jonathan Leffler 回答错误的来源一样,我想提一下,反向引用并不总是好东西,有时它真的会减慢脚本的速度。

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

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

将完成这项工作。

于 2012-08-11T06:33:10.477 回答