15

如何使用正则表达式从与此类似的多行文件中仅使用正则表达式 grep 提取电子邮件地址。(准确地说是一个 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
4

4 回答 4

45

如果你仍然想走这grep -o条路,这个对我有用:

$ grep -i -o '[A-Z0-9._%+-]\+@[A-Z0-9.-]\+\.[A-Z]\{2,4\}' file.csv
cgreen@blah.com
$ 

我的路径中似乎有 2 个版本的 grep,2.4.2 和 2.5.1。只有 2.5.1 似乎支持 -o 选项。

您的正则表达式很接近,但您缺少两件事:

  • 正则表达式区分大小写。因此,您可以传递给 grep 或在方括号表达式中-i添加额外内容a-z
  • +修饰符和花{}括号似乎需要转义。
于 2013-11-13T00:22:41.690 回答
3

如果您知道字段位置,那么使用 awk 或 cut 会容易得多:

awk -F ',' '{print $7}' file

或者

cut -d ',' -f7 file
于 2013-11-12T22:13:34.093 回答
1

您可以在内置模块和外部模块的帮助下使用解决它,如下所示:csvvalidators

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
于 2013-11-12T22:23:40.717 回答
1

处理此问题的最佳方法是使用适当的 CSV 解析器。如果它是一次性任务,一种简单的方法是将 CSV 文件加载到您最喜欢的电子表格软件中,然后仅提取电子邮件字段。

使用正则表达式解析 CSV 很困难,因为可能会出现转义逗号、引用文本等。

考虑一下,根据 Internet 标准,以下是有效的电子邮件地址:

  • foo,bar@gmail.com
  • foo"bar@gmail.com

如果您知道您永远不会拥有此类数据,那么简单的 grep 和 awk 工具可能会起作用(如@anubhava 的回答)。

于 2013-11-12T22:22:30.913 回答