使用Grep从名称的电子邮件地址的文本文件列表中提取电子邮件地址

时间:2014-02-20 20:07:56

标签: text grep textwrangler

对于那些已经存在的问题,这是一个类似的问题,但找不到具体回答我问题的问题,所以感谢您的任何帮助/见解。

所以我有一个文本文件,我在TextWrangler(流行的Mac文本编辑器)中打开了电子邮件名称和地址。样本记录:

Timmy Turner <tturner@example.com>
"jamminjeff@example.com" <jamminjeff@example.com>
Susan Alder <suesblues@example.com>,
sallyartist@example.com

因此,一些名称在其前面的电子邮件地址,大多数电子邮件都包含在&lt;&gt;括号和一些电子邮件本身已经是正确的,有些则用逗号表示。我想做一个全局的过程,通过Grep或类似的东西自动化获得这个最终结果的过程:

tturner@example.com
jamminjeff@example.com
suesblues@example.com
sallyartist@example.com

感谢您的任何见解!

2 个答案:

答案 0 :(得分:1)

sed可能会更好。您可以使用正则表达式删除不需要的模式:

sed -e "s|.*<||" -e "s|>.*||"  your_file.txt  > new_file.txt

答案 1 :(得分:0)

TL; DR

搜索:

^.*<?\b([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])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-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])+)\])\b>?.*$

替换:

\1@\2

说明:

根据this articleRFC 5322规范给出了有效电子邮件地址的官方定义。

它们在TextWrangler中简化的字符串将是:

搜索:

([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])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-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])+)\])

替换:

\1@\2

它本身就匹配:

Timmy Turner&lt; tturner@example.com &gt;
jamminjeff@example.com ”&lt; jamminjeff@example.com &gt;
Susan Alder&lt; suesblues@example.com &gt;,
sallyartist@example.com

虽然这与您的示例电子邮件字符串匹配,但它并不能提供您想要的确切结果,因为它还包括"jamminjeff@example.com",应该将其删除。

如果你知道一些事情,你可以在它之前和之后使用一些过滤:

  1. 在电子邮件字符串之前丢弃所有是否可以?
  2. 是否可以在电子邮件字符串之后丢弃所有
  3. 是否会找到与需要删除的电子邮件字符串对接的其他任何文本?
  4. 如果为1和2,为3,请在^.*<?\b前添加该字符串,并将其附加\b>?.*$

    从行的开头开始,搜索0个或更多字符,可选的左括号,然后是一个开始实际电子邮件地址的字边界。

    然后,在电子邮件地址的最后一个字符,可选的结束括号以及直到行尾的零个或多个字符中查找单词边界。

    \1@\2替换它会清除整行,只包含电子邮件地址。