我试图找到一种方法来了解用源代码编写的电子邮件。我找到了一种使用 来获取我正在寻找的信息的方法grep
,但由于我不太熟悉语法,所以我正在研究将来grep
如何使用它。sed
我用 grep 做的是:
grep [0-9a-zA-Z]@[0-9a-zA-Z] ./ -r | \
grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' | \
sort | uniq -c | sort -n
该(第二个)grep
表达式是在网上找到的,并且有一堆未匹配的内容。
到目前为止我的 sed 表达式是:
grep -h [0-9a-zA-Z]@[0-9a-zA-Z] ./ -r | \
sed -nre 's/.*\([a-zA-Z0-9\.]*@[a-zA-Z0-9\.]*\).*/\1/p' | \
sort | uniq -c | sort -n
它的问题是sed
正则表达式是贪婪的。我想过使用/expression/s/.*/\1/
,但sed
没有找到\1
,因为我猜匹配项仅限于.*
.
答案1
使用grep
:
grep -rhoE '[[:alnum:].!#$%&'\''*+/=?^_`{|}~-]+@[[:alnum:].]+' .
也许:
grep -rhoP '(?:[a-z0-9!#$%&'\''*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'\''*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])' .
关于问题:
- 不要使用
.*
尝试否定子表达式中使用的字符类。例如:
sed -nE -e 's/[^[:alnum:]._-]*([[:alnum:]._-]+@[[:alnum:]._-]+)[^[:alnum:]._-]*/\1\
/gp'
答案2
FWIW我使用这个ERE(所以它可以在grep -E
、sed -E
、awk
、perl
等中工作):
[0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}
基于正则表达式http://www.regular-expressions.info/email.html。如果您的工具支持的话,请添加单词边界,如果没有示例输入/输出,我无法建议任何其他内容来绑定电子邮件地址。我特别不使用字符类,因此我只得到英文字母,因为这最适合我的应用程序。