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',那么最好不要使用引号。
我正在尝试使用 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',那么最好不要使用引号。