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

标签 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")

这会导致错误:

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/

相关文章:

C - 将非字母字符读取为字边界

java - 正则表达式: quantifying a non-capturing group

linux - 如何对行进行多次排序?

swift - 杀死 :9 when running app with entitlements

bash - 从命令行运行 cassandra 查询

linux - 如何将当前路径复制到剪贴板?

javascript - 创建javascript正则表达式以使用白名单替换字符

javascript - 防止 Javascript 中 SI 前缀的正则表达式回溯

MAC OS X 上的 Eclipse 未检测到 LLVM 工具链

python - 如何通过Python执行任意shell脚本并传递多个变量?