我有一个包含以下内容的文件:
void verifyFooBar() {
}
void verifyFooBar123() {
}
我使用grep匹配以verify
开头但不包含使用此命令的数字的函数名称:
grep verify[a-zA-Z]+\( *
但是我没有得到任何与grep的匹配。为什么是这样?我能够看到这个正则表达式在线使用正则表达式测试工具。如果重要,我正在使用OSX 10.9。
答案 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
$