MacOSX 10.9.5 上的 Sed 错误"1 not defined in the RE"



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

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 的建议添加和删除 -E 开关,未在 RE 中定义。帮助?!

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

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

或者,为了娱乐价值,您可以在没有-E的情况下做到这一点:

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

-e是一个作弊;它只是标识一个表达式,它是sed脚本的一部分。 这并不意味着"与-E相反",您可以同时拥有-E和一个或多个-e …arg…参数对。

请注意,文件名应用引号引起来,除非您有意确保删除任何前导或尾随空格,并将任何内部制表符或换行符替换为空白,并将名称中的任何多个空格替换为单个制表符。 如果您确实想要"空间规范化",那么最好省略引号。

最新更新