我有很多需要更改一行的文件。
以下是代码:
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正在吃它们。那时候并不匹配。感谢。
答案 0 :(得分:2)
我假设您使用的是Unix版操作系统,而不是Windows。由于你在代码周围使用双引号,shell正在解析它,并且 - 除其他外 - 用单个反转替换双反斜杠。所以perl看到的代码实际上是 not :
s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/
但:
s/\$nwisDBOption\);/\$nwisDBOption\) || \&WSCExtractor::usage\(\);/
您可以通过运行以下命令轻松确认:
echo "s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/"
无论如何,有几种方法可以解决问题。我建议使用单引号而不是双引号,或者只是将代码写入实际的Perl脚本文件并以这种方式运行。
但是,如果您真的想要,那么可以将代码中的所有反斜杠加倍。