繁体   English   中英

使用Bash或命令行使用正则表达式从文本文件中提取电子邮件地址

[英]Extract email addresses from text file using regex with bash or command line

我该如何使用正则表达式从具有多行类似内容的文件中仅提取出电子邮件地址。 (准确的说是一个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

如果您仍然想使用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选项。

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

  • 正则表达式区分大小写。 因此,您可以将-i传递给grep或在方括号表达式中添加额外的az
  • +修饰符和{}花括号似乎需要转义。

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

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

要么

cut -d ',' -f7 file

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

由于正则表达式,引号等可能会转义,因此很难用正则表达式解析CSV。

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

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

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

您可以在内置的csv模块和外部validators模块的帮助下使用解决此问题,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM