首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由于shell转义,perl正则表达式匹配的次数超出了应有的范围

由于shell转义,perl正则表达式匹配的次数超出了应有的范围
EN

Stack Overflow用户
提问于 2012-12-28 00:58:54
回答 1查看 96关注 0票数 1

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

代码如下:

代码语言:javascript
运行
复制
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);
}

这是我想要的:

代码语言:javascript
运行
复制
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命令:

代码语言:javascript
运行
复制
perl -pi -e "s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/" extractor-template

结果如下:

代码语言:javascript
运行
复制
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吃掉它们。它当时并不匹配。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-28 01:25:00

我假设你使用的是Unixish操作系统,而不是Windows。由于您在代码两边使用了双引号,因此shell将对其进行解析,并将双反斜杠替换为单反斜杠。所以perl看到的代码实际上不是

代码语言:javascript
运行
复制
s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/

但是:

代码语言:javascript
运行
复制
s/\$nwisDBOption\);/\$nwisDBOption\) || \&WSCExtractor::usage\(\);/

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

代码语言:javascript
运行
复制
echo "s/\\\$nwisDBOption\);/\\\$nwisDBOption\) || \&WSCExtractor::usage\(\);/"

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

然而,如果你真的想这样做,你可以在你的代码中把所有的反斜杠都翻倍。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14058269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档