如何使用具有与此类似的多行的文件中的正则表达式来仅显示电子邮件地址。 (确切地说是一个sql转储)
不幸的是,此时我不能再返回并转储电子邮件列。
示例数据:
62372,35896,1,cgreen,Chad,Green,cgreen@blah.com,123456789,0,,,,,,,,,3,Blah,,2013-05-02 17:42:31.659574,164842,,0,0
我试过这个但是没有用:
grep -o '[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}' file.csv
答案 0 :(得分:34)
如果您仍想使用grep -o
路线,这个路线适合我:
$ grep -i -o '[A-Z0-9._%+-]\+@[A-Z0-9.-]\+\.[A-Z]\{2,4\}' file.csv
cgreen@blah.com
$
我的路径中似乎有两个版本的grep,2.4.2和2.5.1。只有2.5.1似乎支持-o选项。
你的正则表达式很接近,但你遗漏了两件事:
-i
传递给grep,也可以将额外的a-z
添加到方括号表达式中+
修饰符和{}
花括号似乎需要转义。答案 1 :(得分:3)
如果您知道场位置,那么使用awk或cut会更容易:
awk -F ',' '{print $7}' file
OR
cut -d ',' -f7 file
答案 2 :(得分:1)
处理此问题的最佳方法是使用正确的CSV解析器。如果这是一次性任务,一种简单的方法是将CSV文件加载到您最喜欢的电子表格软件中,然后只提取电子邮件字段。
使用正则表达式解析CSV很困难,因为有可能转义逗号,引用文本等。
根据互联网标准,请考虑以下是有效的电子邮件地址:
如果你知道一个事实,你将永远不会有这种数据,那么也许简单的grep和awk工具将起作用(如@ anubhava的答案)。
答案 3 :(得分:1)
您可以借助内置csv
模块和外部validators
模块,使用python解决此问题,如下所示:
import validators
import csv
import sys
with open(sys.argv[1], newline='') as csvfile:
csvreader = csv.reader(csvfile)
for row in csvreader:
for field in row:
if validators.email(field):
print(field)
像以下一样运行:
python3 script.py infile
产量:
cgreen@blah.com