我有一个目录,其中包含几个具有以下模式的文件。
1953-蝴蝶夫人
1953-蝴蝶夫人_001
我正在尝试重命名它们以实现以下目标:
蝴蝶夫人[1953]
蝴蝶夫人_001[1953]
这意味着删除“-”并将年份括在方括号中。由于数字比年份多,我认为该命令应该只匹配四位数字。
我读完了 sed 文档,但没找到任何解决方案。使用 sed 可以实现我的目标吗?提前致谢。
答案1
您可以在纯 bash 中执行此操作:
for f in [0-9][0-9][0-9][0-9]-*; do
mv "$f" "${f:5}[${f:0:4}]"
done
答案2
要重命名目录中的所有文件,请使用
ls -1|sed -r 's/^([0-9]{4})(-)(.*)$/mv "&" "\3[\1]"/g'|sh
经过测试GNU sed version 4.2.1
答案3
使用扩展正则表达式( -r
):
sed -rn -e 's/^([0-9]{4})-(.*)$/\2[\1]/p' /tmp/input_file
或者不使用扩展正则表达式(添加一些反斜杠):
sed -n -e 's/^\([0-9]\{4\}\)-\(.*\)$/\2[\1]/p' /tmp/input_file
在这两种情况下,最重要的是要匹配任何数字([0-9]
)恰好 4 次{4}
。我们要确保这些数字之前没有任何内容,这就是为什么使用^
是行首,而数字之后没有任何内容,这就是为什么我们添加-
。如果可能存在除数字以外的其他字符,您可以将其更改-
为类似于表示除数字以外的任何内容,或者如果数字也可以接受,则删除它。[^0-9]
-
如果需要,您还可以使用?
,例如使第一组数字可选,如果没有匹配,则只打印文件名而不进行任何更改。