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)
括号似乎不适用于分组,但我发现的所有教程和示例似乎都认为它们应该......
在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)