在MacOSX 10.9.5上,Sed错误“\ 1未在RE中定义”

时间:2015-01-21 16:31:01

标签: regex macos bash sed

我正在尝试使用bash为我的MP3文件名(非常重要)构建一个通用格式化程序,其中很大一部分是能够使用正则表达式变量移动文本。例如,我试图从ft.Kevin Parker周围删除括号()。

oldfilename="Mark Ronson - 02 Summer Breaking (ft. Kevin Parker).mp3"

newfilename=$(echo $oldfilename | sed -E "s/ft.\(*\)/ft.\1/g")

这会导致错误:

sed: 1: "s/ft.\(*\)/gt.\1/g": \1 not defined in the RE

我已尝试转义而不是转义(),并按照.bash_profile sed: \1 not defined in the RE的建议添加和删除-E开关。帮助?!

1 个答案:

答案 0 :(得分:6)

如果您使用-E,则\(\)是实际的括号;要捕获,您只需使用()。在这里,您要删除括号,因此您需要匹配文字(,将内容捕获到下一个)并匹配但不捕获关闭),并替换整个很多只有捕获:

newfilename=$(echo "$oldfilename" | sed -E "s/\((ft[^)]*)\)/\1/g")

或者,对于娱乐价值,您可以在没有-E的情况下执行此操作:

newfilename=$(echo "$oldfilename" | sed -e "s/(\(ft[^)]*\))/\1/g")

-e是作弊;它只是标识了sed脚本中的一个表达式。它并不意味着'-E'的对面,你可以同时拥有-E 1}}和一个或多个-e …arg…参数对。)

请注意,文件名应使用引号,除非您故意确保删除任何前导或尾随空白,并且任何内部选项卡或换行符都替换为空格,并且名称中的任何多个空格都将替换为单个选项卡。如果你确实想要'空间标准化',那么将引号保留下来会更好。