regex - 为什么我在运行 Perl 单行程序时得到 "-bash: syntax error near unexpected token ` ('"?

标签 regex linux perl

这让我发疯。这是我的困境,我有一个文件需要在其中进行匹配。通常我使用 Perl,它的工作就像一个魅力,但在这种情况下,我正在编写一个 shell 脚本,并且由于某种原因它会抛出错误。

这是我要匹配的内容:

loop_loopStorage_rev='latest.integration'

我需要匹配 looplatest.integration

这是我的正则表达式:

^(?!\#)(loop_.+rev).*[\'|\"](.*)[\'|\"]$

当我在 Perl 脚本中使用它时,$1$2 会给我适当的输出。如果我这样做:

perl -nle "print qq{$1 => $2} while /^(?!#)(loop_.+rev).+?[\'|\"](.+?)[\'|\"]$/g" non-hadoop.env

我得到错误:

-bash: syntax error near unexpected token `('

我相信这与我的正则表达式的开头部分有关。所以我真正的问题是使用 sed、egrep 或 awk 会有更简单的解决方案吗?如果是这样,有人知道从哪里开始吗?

最佳答案

在参数周围使用单引号以防止对 $\ 等进行特殊处理。如果需要在其中包含单引号,通用解决方案是使用'\''。然而,在这种特殊情况下,我们可以通过在正则表达式模式中使用等效的 \x27 来避免尝试包含 '

perl -nle'
   print "$1 => $2"
      while /^(?!#)(loop_.+rev).+?[\x27\"|](.+?)[\x27\"|]$/g;
' non-hadoop.env

[为了便于阅读,我添加了一些换行符。如果你愿意,你实际上可以把它们留在里面,但你不需要。]


请注意,您的正则表达式模式存在一些问题。

  1. (?!\#)(loop_.+rev)(loop_.+rev) 相同,因为 l 不是 #,所以 (?!\#) 没有按照您认为的那样去做。

  2. [\'|\"] 匹配 '"|,但我认为您只是想匹配 '"。如果是这样,您想使用 [\'\"],这可以简化到 ['"]

  3. 不要使用非贪婪修饰符(?+* 等之后)。它用于优化,而不是用于排除字符。事实上,您的模式中的第二个 ? 完全没有效果,所以它并没有按照您的想法行事。

固定了吗?

perl -nle'
   print "$1 => $2"
      while /^(loop_.+rev).+[\x27"]([^\x27"]*)[\x27"]$/g;
' non-hadoop.env

关于regex - 为什么我在运行 Perl 单行程序时得到 "-bash: syntax error near unexpected token ` ('"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30762228/

相关文章:

c++ - 如何在 Linux 中的虚拟网络摄像头上写字?

regex - Notepad++:搜索正则表达式 n 次

Java正则表达式replaceAll()

regex - 冗长的 Perl 正则表达式

perl - DynaLoader 在@INC 中看到错误的值

Perl DBD::Oracle 模块安装

regex - 无法获取多行正则表达式来匹配字符串

php - 比较 http_referer 值

c - 在 Windows 和 *nix 系统上解析共享库路径

linux - 使用 sed 删除包含特定单词的段落