perl正则表达式匹配超过它应该 - 由于shell转义

时间:2012-12-27 16:58:54

标签: regex perl

我有很多需要更改一行的文件。

以下是代码:

GetOptions ('full' => \$full,
        'dbno=s' => \$dbno,
            'since=s' => \$since,
            'printSQL' => \$printSQL,
            'nwisDB=s' => \$nwisDBOption);

# Find the NWISDB to be extracted

if ($nwisDBOption eq '') {
  $nwisdb = &WSCExtractor::getNwisdb;
} else {
  $nwisdb = uc($nwisDBOption);
}

这就是我想要的:

GetOptions ('full' => \$full,
        'dbno=s' => \$dbno,
            'since=s' => \$since,
            'printSQL' => \$printSQL,
            'nwisDB=s' => \$nwisDBOption) || &WSCExtractor::usage();

# Find the NWISDB to be extracted

if ($nwisDBOption eq '') {
  $nwisdb = &WSCExtractor::getNwisdb;
} else {
  $nwisdb = uc($nwisDBOption);
}

这是我正在使用的perl命令:

perl -pi -e "s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/" extractor-template

结果如下:

GetOptions ('full' => \$full,
        'dbno=s' => \$dbno,
            'since=s' => \$since,
            'printSQL' => \$printSQL,
            'nwisDB=s' => \$nwisDBOption) || &WSCExtractor::usage();

# Find the NWISDB to be extracted

if ($nwisDBOption eq '') {
  $nwisdb = &WSCExtractor::getNwisdb;
} else {
  $nwisdb = uc($nwisDBOption) || &WSCExtractor::usage();
}

它匹配$ nwisDBOption的第二个实例,即使它前面没有\。我尝试在前面添加更多\,以防perl正在吃它们。那时候并不匹配。感谢。

1 个答案:

答案 0 :(得分:2)

我假设您使用的是Unix版操作系统,而不是Windows。由于你在代码周围使用双引号,shell正在解析它,并且 - 除其他外 - 用单个反转替换双反斜杠。所以perl看到的代码实际上是 not

s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/

但:

s/\$nwisDBOption\);/\$nwisDBOption\) || \&WSCExtractor::usage\(\);/

您可以通过运行以下命令轻松确认:

echo "s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/"

无论如何,有几种方法可以解决问题。我建议使用单引号而不是双引号,或者只是将代码写入实际的Perl脚本文件并以这种方式运行。

但是,如果您真的想要,那么可以将代码中的所有反斜杠加倍。