1

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

这是代码:

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 吃掉它们。当时不匹配。谢谢。

4

1 回答 1

2

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

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

但:

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

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

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

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

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

于 2012-12-27T17:25:00.010 回答