2

我正在尝试从文件中获取电子邮件地址,egrep -o -e并且在行尾遇到地址问题。

这是我的正则表达式:

egrep -o -e "[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+" ~/myfile.txt

我意识到这不会捕获电子邮件地址的所有变体,但如果地址位于行尾,这就是我得到的:

user@_12345@myemail.com\ul

所以我想我会尝试一个负面的前瞻,但我不知道如何正确使用它。我在网上读过一些东西,但我对它的工作原理感到困惑。

这是我尝试过的:

egrep -o -e "(?!\\[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+)" ~/myfile.txt

Bash 失败了event not found: \\[._a

有什么建议么?

4

2 回答 2

4

!正在作为 bash 中的历史扩展命令进行插值。您应该使用单引号而不是双引号来防止这种情况。

但是,您应该注意,您的任何一个版本都可能不支持负前瞻grep。在这种情况下,您需要更强大的正则表达式工具,例如perlor ack

于 2013-07-22T15:36:40.997 回答
2

点代表什么?

"[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+"
                              ^
                             here

它与 at 符号匹配。如果您删除它,您的原始正则表达式没有前瞻将起作用。

而且,!是bash(历史扩展)中的一个特殊字符。您必须反斜杠才能按字面意思使用它。

于 2013-07-22T15:36:34.440 回答