sed - * 有效,+ 无效?

sed - * 有效,+ 无效?

我正在重命名一堆音乐文件,使用 sed 删除曲目编号。然而,我对 sed 对正则表达式的“+”字符的行为感到困惑。

我想做的:

for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9]+/\-/g'; done

但这并没有按预期进行。这个解决方法完成了工作:

for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9][0-9]*/\-/g'; done

不过我想知道在 sed 中使用“+”有什么问题......有什么想法吗?

答案1

+是一个扩展的正则表达式修饰符。sed基本正则表达式默认情况下。

要将sed表达式解析为扩展正则表达式,请使用sed -E.如果您将其用作.GNUsed也可以理解基本的正则表达式。+\+

另外,你的图案*\-[0-9]**看起来很奇怪。不需要-转义(不在 shell 模式中,也不在正则表达式中),除非您使用globstarin bash,否则该**模式将扩展到自身。globstar启用后,将bash *-[0-9]**扩展到-N第一个文件名组件(其中N是数字)中包含的所有路径名。

我认为你想做的是这样的(可能不完全是,但我不知道你的文件名是什么样的):

for name in *-[0-9][0-9]*; do
    newname=${name%-*}
    printf 'Would rename "%s" into "%s"\n' "$name" "$newname"
    # mv "$name" "$newname"
done

这匹配当前目录中包含-NNN是数字)的所有名称。它删除-文件名中最后一个的所有内容并重命名文件(实际的重命名被注释掉)。

相关内容