我正在尝试重命名目录中的一堆文件,而我却陷入了它的正则表达式部分。
我想从开头出现的文件名中删除某些字符。
示例1:_00-author--book_revision_
预期:Author - Book (Revision)
到目前为止,我可以使用正则表达式删除下划线和&首字母的首字母
$newfile =~ s/_/ /g;
$newfile =~ s/^[0-9]//g;
$newfile =~ s/^[0-9]//g;
$newfile =~ s/^-//g;
$newfile = ucfirst($newfile);
这不是一个好方法。我需要帮助删除所有字符,直到你点击第一个字母,当你点击第一个' - '时我想在' - '之前和之后添加一个空格。 当我点击第二个' - '时,我想用'('。
替换它非常感谢任何有关采取正确方法的指导,提示甚至建议。
答案 0 :(得分:1)
您的说明和示例不匹配。
根据您的指示,
s/^[^\pL]+//; # Remove everything until first letter.
s/-/ - /; # Replace first "-" with " - "
s/-[^-]*\K-/(/; # Replace second "-" with "("
根据你的例子,
s/^[^\pL]+//;
s/--/ - /;
s/_/ (/;
s/_/)/;
s/(?<!\pL)(\pL)/\U$1/g;
答案 1 :(得分:1)
$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u\1 - \u\2 (\u\3),;
我的Perl解释器(使用严格和警告)说这更好地写为:
$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u$1 - \u$2 (\u$3),;
第一个可能是它的味道更加 sedish ! (当然两个版本都是一样的。)
解释(根据stema的要求):
$filename =~ s/
^ # matches the start of the line
_\d+- # matches an underscore, one or more digits and a hypen minus
(.*?)-- # matches (non-greedyly) anything before two consecutive hypen-minus
# and captures the entire match (as the first capture group)
(.*?)_ # matches (non-greedyly) anything before a single underscore and
# captures the entire match (as the second capture group)
(.*?)_ # does the same as the one before (but captures the match as the
# third capture group obviously)
$ # matches the end of the line
/\u$1 - \u$2 (\u$3)/x;
替换规范中的\u${1..3}
只是告诉Perl从1到3插入捕获组,其第一个字符为大写。如果您想要将整个匹配(在捕获的组中)大写,则必须使用\U
代替。
x 标志打开 verbose 模式,它告诉Perl解释器我们要使用#注释,因此它会忽略这些(以及正则表达式中的任何空格 - 因此,如果要匹配空格,则必须使用\s
或\
)。不幸的是我无法弄清楚如何告诉Perl忽略* replacement *规范中的空格 - 这就是为什么我把它写在一行上。
(另请注意,我已经改变了我s
终止从,
为/
- Perl的咆哮在我,如果我用,
与详细模式开启。 ..不完全确定原因。)
答案 2 :(得分:1)
那么你想要将新文件名的所有组件大写,还是仅仅是第一个?你的问题在这一点上是不一致的。
请注意,如果你在Linux上,你可能有rename
命令,它将采用perl表达式并使用它为你重命名文件,如下所示:
rename 'my ($a,$b,$r);$_ = "$a - $b ($r)"
if ($a, $b, $r) = map { ucfirst $_ } /^_\d+-(.*?)--(.*?)_(.*?)_$/' _*
答案 3 :(得分:0)
如果他们都遵循该格式,请尝试:
my ($author, $book, $revision) = $newfiles =~ /-(.*?)--(.*?)_(.*?)_/;
print ucfirst($author ) . " - $book ($revision)\n";