为什么这个正则表达式不适用于grep?

时间:2015-02-27 19:48:27

标签: regex macos grep

我有一个包含以下内容的文件:

void verifyFooBar() {
}

void verifyFooBar123() {
}

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

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

2 个答案:

答案 0 :(得分:3)

单引号你的正则表达式字符串(以防止你的shell抓住它的任何部分),逃避加号,并且不要逃避你的开放paren(所以它可以被解释为文字字符)。

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

这是经过测试和运作的

答案 1 :(得分:3)

+是一个ERE元字符。 grep默认使用BRE。你作为BRE写的东西是:

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

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

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

在过去的几年中,一些greps(和seds)得到了增强,即使在处理BRE时,你也可以通过转义它来“打开”给定字符的ERE元字符功能,例如:

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

我认为POSIX这些天甚至可能会指定您可以在BRE中使用\<ERE meta-char>。 GNU工具可以做到这一点,不确定其他人。但有些不像Solaris上的默认工具那样:

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