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

Sed error "\1 not defined in the RE" on MacOSX 10.9.5

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

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

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

这会导致错误:

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

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

如果你使用-E,那么\(\)就是真正的括号;要捕获,您只需使用 ()。这里,要去掉括号,所以需要匹配一个文字(,捕获到下一个)的内容并匹配但不捕获结束的),并替换整个很多只是捕获:

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

或者,为了娱乐价值,你可以不用-E:

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

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

请注意,文件名应该用引号引起来,除非您有意确保删除任何前导或尾随空格,并且任何内部制表符或换行符都替换为空格,并且名称中的任何多个空格替换为单个选项卡。如果您确实想要 'space normalization',那么最好不要使用引号。