用图案重命名

时间:2013-08-23 23:00:31

标签: regex perl rename

我有很多文件看起来像这样:

"THIS IS my file.txt"
"THIS IS My file.txt"
"THIS IS m file.txt"
"THIS IS M file.txt"

所以基本上,如果我试着描述它,文件名由两部分组成,一部分是大写,另一部分是小写(虽然第二部分的第一个字母也可以是大写)。单词可以由一个单独的char组成。当有选择时,大写的单个字符单词被认为是第一部分。

我想提取文件名的第一部分,由大写单词组成,将它们设置为小写(只有第一个字母为大写),并用连字符将其与其余部分分开。

所以我期待的结果是:

"This Is - my file.txt"
"This Is - My file.txt"
"This Is - m file.txt"
"This Is M - file.txt"

到目前为止我所拥有的是:

rename 's/^(([A-Z]{2,}| )+)(.*)/\u\L$1\E - $3/g' *

但是它有很多问题(一个字母的大写单词不匹配,只有第一个单词大写)。

1 个答案:

答案 0 :(得分:2)

我认为你正在寻找的正则表达式是:

s/^((?:[A-Z]+ )+)/(join " ", map ucfirst, split " ", lc $1) . " - "/e

我测试了这样:

$ perl -pe 's/^((?:[A-Z]+ )+)/(join " ", map ucfirst, split " ", lc $1) . " - "/e' <<eoq
THIS IS my file.txt
THIS IS My file.txt
THIS IS m file.txt
THIS IS M file.txt
eoq

这是输出:

This Is - my file.txt
This Is - My file.txt
This Is - m file.txt
This Is M - file.txt