无法使用sed进行分组

mat*_*teo 1 regex grouping backreference sed parentheses

这按预期工作:

INPUT FILE src.txt:

ffmpeg -i uno.3gp
ffmpeg -i dos.3gp
ffmpeg -i tres.3gp
Run Code Online (Sandbox Code Playgroud)

命令:

sed 's/-i .*\./XXX/' <src.txt
Run Code Online (Sandbox Code Playgroud)

结果如预期:

ffmpeg XXX3gp
ffmpeg XXX3gp
ffmpeg XXX3gp
Run Code Online (Sandbox Code Playgroud)

那么为什么这些不能按预期工作:

命令:

sed 's/-i (.*)\./XXX/' <src.txt
Run Code Online (Sandbox Code Playgroud)

预期:

ffmpeg XXX3gp
ffmpeg XXX3gp
ffmpeg XXX3gp
Run Code Online (Sandbox Code Playgroud)

实际结果:

ffmpeg -i uno.3gp
ffmpeg -i dos.3gp
ffmpeg -i tres.3gp
Run Code Online (Sandbox Code Playgroud)

命令:

sed 's/-i (.*)\.3gp/\1.mp3/' <src.txt
Run Code Online (Sandbox Code Playgroud)

预期:

ffmpeg uno.mp3
ffmpeg dos.mp3
ffmpeg tres.mp3
Run Code Online (Sandbox Code Playgroud)

实际结果

sed: -e expression #1, char 18: invalid reference \1 on `s' command's RHS
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 5

在Classic sed(不是GNU sed必需)中,分组命令使用\(\)(和计数使用\{\})而不是非转义.

因此,你应该尝试:

sed 's/-i \(.*\)\./XXX/' <src.txt
sed 's/-i \(.*\)\.3gp/\1.mp3/' <src.txt
Run Code Online (Sandbox Code Playgroud)

或者,如果你有GNU sed,添加-r--regexp-extended"在脚本中使用扩展的正则表达式"(引用sed --help).

sed -r 's/-i (.*)\./XXX/' <src.txt
sed -r 's/-i (.*)\.3gp/\1.mp3/' <src.txt
Run Code Online (Sandbox Code Playgroud)