为什么这个正则表达式在 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
$
我有一个包含这些内容的文件:
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
$