如果我的字符串包含'/',我如何使用's ///'?

Dav*_*ave 5 perl

我在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行终止.

当有问题的变量包含正则表达式字符时,如何对文件进行搜索和替换?谢谢.

Zai*_*aid 6

似乎$localTestDir已经开始了/.

通过将正则表达式分隔符更改为以下内容之外的其他方法进行补救/:

my $searchAndReplaceCmd = "perl -pi -e 's!\\Q${localTestDir}\\E!!g' ${testSuiteFile}";
Run Code Online (Sandbox Code Playgroud)

来自perldoc perlrequick:

$x = "A 39% hit rate";
$x =~ s!(\d+)%!$1/100!e;       # $x contains "A 0.39 hit rate"
Run Code Online (Sandbox Code Playgroud)

最后一个示例显示s///可以使用其他分隔符,例如 s!!!s{}{},甚至s{}//.如果使用单引号s''',那么正则表达式和替换将被视为单引号字符串.


TLP*_*TLP 2

问题是为什么你要在 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)