我在Mac 10.6.6上使用Perl 5.10.6.我想执行一个简单的搜索并替换文件,所以我尝试:
my $searchAndReplaceCmd = "perl -pi -e 's/\\Q${localTestDir}\\E//g' ${testSuiteFile}";
system( $searchAndReplaceCmd );
Run Code Online (Sandbox Code Playgroud)
但上面的问题是变量$localTestDir包含目录分隔符("/"),这搞砸了正则表达式...
Bareword发现运营商预期在-e line 1,靠近"s /\Q/home/selenium"
反斜杠发现其中运营商预计将在-e 1号线,靠近"活\"语法错误在-e行1,近"S /\Q /家/硒"
搜索模式未在-e第1行终止.
当有问题的变量包含正则表达式字符时,如何对文件进行搜索和替换?谢谢.
似乎$localTestDir已经开始了/.
通过将正则表达式分隔符更改为以下内容之外的其他方法进行补救/:
my $searchAndReplaceCmd = "perl -pi -e 's!\\Q${localTestDir}\\E!!g' ${testSuiteFile}";
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)$x = "A 39% hit rate"; $x =~ s!(\d+)%!$1/100!e; # $x contains "A 0.39 hit rate"最后一个示例显示
s///可以使用其他分隔符,例如s!!!和s{}{},甚至s{}//.如果使用单引号s''',那么正则表达式和替换将被视为单引号字符串.
问题是为什么你要在 perl 中通过 shell 在 perl 中进行搜索和替换。看起来像是一种迂回的做事方式,你会遇到 shell 插值的问题。
应该\Q ... \E覆盖字符串中的特殊字符,因此/“应该”不是问题。来自佩尔雷:
\Q quote (disable) pattern metacharacters till \E
Run Code Online (Sandbox Code Playgroud)
这是一个替代方案(未经测试),全是 Perl 解决方案。如果您想更加确定,请将/分隔符替换为其他内容,例如s###(您可以使用任何字符作为分隔符)。
use strict;
use warnings;
use File::Copy;
open my $fh, '<', $testSuiteFile or die $!;
open my $out, '>', $testSuiteFile . ".bak" or die $!;
while (<$fh>) {
s/\Q${localTestDir}\E//g;
print $out $_;
}
move($testSuiteFile . ".bak", $testSuiteFile) or die $!;
Run Code Online (Sandbox Code Playgroud)
或者使用Tie::File
use strict;
use warnings;
use Tie::File;
tie, my @file, 'Tie::File', $testSuiteFile or die $!;
for (@file) {
s/\Q${localTestDir}\E//g;
}
untie @file;
Run Code Online (Sandbox Code Playgroud)