我正在尝试使用 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 开关。 .帮忙?!
最佳答案
如果您使用-E
,则\(
和\)
是实际的括号;要捕获,您只需使用 (
和 )
。这里,要去掉括号,所以需要匹配一个字面量的(
,捕获到下一个)
的内容,匹配但不捕获结束的)
,并用捕获替换整个批处理:
newfilename=$(echo "$oldfilename" | sed -E "s/\((ft[^)]*)\)/\1/g")
或者,为了娱乐值(value),您可以不使用 -E
:
newfilename=$(echo "$oldfilename" | sed -e "s/(\(ft[^)]*\))/\1/g")
(-e
是一个作弊;它只是标识一个表达式,它是 sed
脚本的一部分。它并不意味着“与 -E< 相对
',你可以同时拥有 -E
和一个或多个 -e …arg…
参数对。)
请注意,文件名应包含在引号中,除非您有意确保删除任何前导或尾随空格,并且任何内部制表符或换行符都替换为空格,并且名称中的任何多个空格替换为单个制表符.如果您确实想要“空间规范化”,那么最好不要使用引号。
关于regex - MacOSX 10.9.5 上的 Sed 错误 "\1 not defined in the RE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28072190/