为什么这个正则表达式在 grep 中不起作用?

Why doesn't this regex work in grep?

我有一个包含这些内容的文件:

void verifyFooBar() {
}

void verifyFooBar123() {
}

我使用 grep 来匹配以 verify 开头但不包含数字的函数名称,使用此命令: grep verify[a-zA-Z]+\( *

但是我没有得到任何与 grep 的匹配。为什么是这样?我能够看到这个正则表达式可以在线使用正则表达式测试器。如果重要的话,我正在使用 OSX 10.9。

单引号您的正则表达式字符串(以防止您的 shell 抓住它的任何位),请转义加号,不要转义您的开括号(因此它可以被解释为文字字符) .

grep 'verify[a-zA-Z]\+(' *

这已经过测试并且有效

+ 是 ERE 元字符。 grep 默认使用 BRE。你想做的写成 BRE 是:

$ grep 'verify[a-zA-Z][a-zA-Z]*(' file             
void verifyFooBar() {

如果你想使用 ERE,你需要用 -E 告诉 grep,然后转义 ( 因为那也是一个 ERE 元字符,但在这种情况下你希望它被处理作为文字:

$ grep -E 'verify[a-zA-Z]+\(' file
void verifyFooBar() {

一些 greps(和 seds)在过去几年中得到了增强,这样即使在使用 BRE 时,您也可以通过转义来 "turn on" 给定字符 ERE 元字符功能,例如:

$ grep 'verify[a-zA-Z]\+(' file 
void verifyFooBar() {

我认为 POSIX 现在甚至可以指定您可以在 BRE 中以这种方式使用 \<ERE meta-char>。 GNU 工具可以做到这一点,不确定还有哪些。不过有些没有,比如 Solaris 上的默认工具:

$ /bin/grep 'verify[a-zA-Z]\+(' file            
$