我正在尝试使用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开关。帮助?!
答案 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…
参数对。)
请注意,文件名应使用引号,除非您故意确保删除任何前导或尾随空白,并且任何内部选项卡或换行符都替换为空格,并且名称中的任何多个空格都将替换为单个选项卡。如果你确实想要'空间标准化',那么将引号保留下来会更好。