lin*_*dhe 5 vim sed regular-expression rename
我在一个目录中有很多名为“bar_foo.txt”的文件,我想将它们重命名为“foo_bar.txt”。
Insed和vim到此的正则表达式类似于's/\(bar\)_\(foo\)/\2_\1/g',在替换中反向引用搜索。
有没有办法做到这一点rename?我已经看到一些黑客通过管道ls传输sed到bash,但这显然不是一个了不起的方法。
是否有其他工具可以做到这一点?
正则表达式的“sed 和 vim 风味”有名称吗?
如果您有renamePerl 正则表达式的实现(如在 Debian/Ubuntu/... 上,或prename在 Arch Linux 上),您需要$1而不是\1. 此外,捕获括号时没有反斜杠:
rename 's/(.*)_(.*)/$2_$1/' *_*
Run Code Online (Sandbox Code Playgroud)
如果没有,你必须自己实现它。
#! /bin/bash
for file in *_* ; do
left=${file%_*}
right=${file##*_}
mv "$file" "$right"_"$left"
done
Run Code Online (Sandbox Code Playgroud)
注意:正如所写,这两个命令都重命名a_b_c为c_a_b. 为了得到b_c_a,第一个捕获组更改为.*?在第一种情况下,还是%要%%和##以#在第二个。