我正在重命名一堆音乐文件,使用 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 模式中,也不在正则表达式中),除非您使用globstar
in 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
这匹配当前目录中包含-NN
(N
是数字)的所有名称。它删除-
文件名中最后一个的所有内容并重命名文件(实际的重命名被注释掉)。