我有大约100个文件,我想在所有文件名中将字母P更改为字母B.但是在使用rename命令时:
rename 's/\P/\Bi/' *.txt
我收到以下消息
Empty \P{} in regex; marked by <-- HERE in m/\P <-- HERE / at (eval 1) line 1.
请帮助
由于
答案 0 :(得分:1)
两个错误。首先,您不需要逃离P
和B
,因为它们不是特殊字符。第二,如果i
表示不区分大小写,那么这是一个标志,需要在最后。
rename 's/P/B/i' *.txt
这会将第一次出现P
或p
更改为B
。如果您想要更改所有匹配项,请使用g
标记,这意味着global
,如下所示:
rename 's/P/B/ig' *.txt
根据新要求进行更新:
从任何复杂的情况来看,最好编写自己的perl
脚本。以下是使用File::Copy核心模块的快速示例。
use strict;
use warnings;
use File::Copy;
my $dir = '/path/to/your/files/'; # path to your files
opendir my ($dh), $dir;
my @files = grep { /\.txt$/ } readdir $dh; # create a list of all files
for(@files) {
my $cnt;
my $from = $_;
chomp $from;
(my $to = $from) =~ s/(P)/++$cnt>=2 && $cnt<=3 ? "B" : $1/gie;
#print "from:$from to:$to\n";
move("$dir$from", "$dir$to") if ($to ne $from);
}
我们创建一个临时变量$cnt
并使用以下条件检查相关字符是第二个还是第三个。如果是,我们将其替换为B
,否则我们保留原样。
++$cnt>=2 && $cnt<=3 ? "B" : $1
答案 1 :(得分:0)