grep + 运算符

grep + 运算符

根据 grep 手册:

  * The preceding item will be matched zero or more times.
  + The preceding item will be matched one or more times.

我们来测试一下

echo 'agb' | grep 'a.*b' # returns agb
echo 'agb' | grep 'a.+b' # returns nothing

为什么+不匹配三个gs?据我所知3比1大。

答案1

我们认为的许多“正则表达式”实际上被称为扩展正则表达式(或 ERE)在 POSIX 中。但您的grep电话似乎是在基本正则表达式模式(或简称 BRE)。 BRE 和 ERE 有许多差异。这些区别之一是您必须转义元字符:+是一个字面加号,除非您用反斜杠转义它。您的grep命令似乎处于 BRE 模式,因此请尝试使用\+而不是普通的+.

如果您对 BRE 与 ERE 非常严格,那么 BRE 实际上并不支持+?操作,尽管您可以分别使用\{1,\}\{0,1\}构造来模拟它们。严格的 BRE 也不支持|运算符,我不确定如何在 BRE 中模拟它。然而,与 ERE 不同,BRE 支持反向引用(这看起来很像 Perl 中的做法,只是必须转义括号)。

某些grep实现(例如 GNU)在 BRE 模式下支持?+|运算符,但您必须像任何其他元字符一样对它们进行转义:\?\+\|。但grep据我所知,没有任何实现支持 ERE 模式下的反向引用。

要强制您grep使用 ERE 模式,您可以使用 选项-Egrep或者也可以将其称为 as egrep

答案2

无论您正在阅读哪本 grep 手册,都应该有一个部分解释不同类型的正则表达式(基本和扩展)。该+运算符在基本版本中不可用,仅在扩展版本中可用。要使用扩展正则表达式,您需要该-E选项。

相关内容