sed 重命名文件,将数字移动到文件末尾

sed 重命名文件,将数字移动到文件末尾

我有一个目录,其中包含几个具有以下模式的文件。

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]-

如果需要,您还可以使用?,例如使第一组数字可选,如果没有匹配,则只打印文件名而不进行任何更改。

相关内容