grep + 运算符

Tri*_*tos 1 grep regular-expression

根据grep手册:

  * The preceding item will be matched zero or more times.
  + The preceding item will be matched one or more times.
Run Code Online (Sandbox Code Playgroud)

让我们测试一下

echo 'agb' | grep 'a.*b' # returns agb
echo 'agb' | grep 'a.+b' # returns nothing
Run Code Online (Sandbox Code Playgroud)

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

The*_*est 5

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

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

一些grep实现(像GNU)支持?+以及|运营商在BRE模式,但你必须逃脱他们像任何其他特殊字符:\?\+,和\|。但是grep我知道没有任何实现支持 ERE 模式下的反向引用。

要强制您grep使用 ERE 模式,您可以使用-E选项 to grep,或者您可以egrep改为调用它。