根据 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 模式,您可以使用 选项-E
,grep
或者也可以将其称为 as egrep
。
答案2
无论您正在阅读哪本 grep 手册,都应该有一个部分解释不同类型的正则表达式(基本和扩展)。该+
运算符在基本版本中不可用,仅在扩展版本中可用。要使用扩展正则表达式,您需要该-E
选项。