mum*_*bot 2 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")
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
sed: 1: "s/ft.\(*\)/gt.\1/g": \1 not defined in the RE
Run Code Online (Sandbox Code Playgroud)
我已尝试转义而不是转义(),并按照.bash_profile sed:\ 1中的建议添加和删除-E开关.救命?!
如果使用-E的话\(和\)有实际括号; 捕获,你只使用(和).在这里,你想要删除括号,所以你需要匹配一个文字(,捕获内容到下一个)并匹配但不捕获关闭),并用仅捕获替换整个批次:
newfilename=$(echo "$oldfilename" | sed -E "s/\((ft[^)]*)\)/\1/g")
Run Code Online (Sandbox Code Playgroud)
或者,为了娱乐价值,你可以不用-E:
newfilename=$(echo "$oldfilename" | sed -e "s/(\(ft[^)]*\))/\1/g")
Run Code Online (Sandbox Code Playgroud)
(这-e是一个作弊;它只是识别一个表达式,sed它是脚本的一部分.它并不意味着'与'相反,-E你可以同时拥有两个-E和一个或多个-e …arg…参数对.)
请注意,文件名应使用引号,除非您故意确保删除任何前导或尾随空白,并且任何内部选项卡或换行符替换为空格,并且名称中的任何多个空格都将替换为单个选项卡.如果你确实想要'空间规范化',那么将引号保留下来会更好.