我有很多文件看起来像这样:
"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' *
但是它有很多问题(一个字母的大写单词不匹配,只有第一个单词大写)。
答案 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