【问题标题】:Regex - match emails in filenames, return list of email addresses正则表达式 - 匹配文件名中的电子邮件,返回电子邮件地址列表
【发布时间】:2024-01-12 17:35:01
【问题描述】:

我有一个像这样的文本文件目录:

listedname_ _email@domain.com__subject_date.eml

文件名保证在“电子邮件”部分具有这种模式:

email@domain.xxx_

因此,电子邮件、at-sign、域、句点、*域名、下划线。 (他们不会总是有一个前导下划线,因为不是每个人都在他们的电子邮件客户端中设置他们的“名字”。)

Windows 上的一个目录中有大约 1,000 个文件,尽管我安装了 Cygwin 工具并且可以导航到该目录。文件内容中还有一行保证看起来像这样:

From: "Bob Lawblog" <boblawblog@domain.law>

我想要做的是使用 grep 或任何工具来返回电子邮件地址列表,仅此而已,格式如下:

email@domain.com <line break>
email2@domain.com <line break>
email3@domain.com <line break>

没有前导或尾随下划线、没有电子邮件正文、没有主题等。(将它放在逗号分隔的列表中也很棒,但不是必需的。)

有人可以帮我使用 regex/grep 命令吗?谢谢!

【问题讨论】:

    标签: regex windows email grep cygwin


    【解决方案1】:

    我想我已经理解了你的问题。如我错了请纠正我。看来您有两个选项可以“获取”电子邮件地址:

    1. 使用文件名,并应用正则表达式。
    2. 使用每个文件中的From: 行获取所需的电子邮件地址。

    我最喜欢第二个选项,因为要找到匹配来自listedname_ _email@domain.com__subject_date.eml 的电子邮件地址的正则表达式会很棘手,因为如果电子邮件地址包含多个下划线怎么办?

    要从每个文件中获取电子邮件地址列表,请尝试以下操作:

    awk '/^From:/ { print substr($NF,2,length($NF)-2) }' *.txt > outfile
    

    如果您想要这些电子邮件地址的 csv,请使用 printf

    awk '/^From:/ { printf "%s,", substr($NF,2,length($NF)-2) } END { printf "\n" }' *.txt > outfile
    

    【讨论】:

    • 这工作几乎完美!我必须进行的更改:*.txt 到 *.eml,当它写入 CSV(使用该选项)时,我在 Excel 中打开它并在新工作表中使用复制 -> 选择性粘贴(检查转置)将它们转置,所以我可以将基于行的 CSV 导入我的电子邮件客户端。非常感谢!