1

这与一些已经存在的问题类似,但找不到专门回答我的问题的问题,因此感谢您提供任何帮助/见解。

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

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

因此,一些电子邮件地址前面有名称,大多数电子邮件用 <> 括号括起来,还有一些电子邮件本身已经正确,还有一些后面有逗号。我想做一个全局过程,通过 Grep 或类似的方法自动完成获得此最终结果的过程:

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

感谢您的任何见解!

4

2 回答 2

1

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

sed -e "s|.*<||" -e "s|>.*||"  your_file.txt  > new_file.txt
于 2014-02-20T20:15:04.073 回答
1

TL;博士

搜索:

^.*<?\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

解释:

根据这篇文章RFC 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

就其本身而言,它将匹配:

蒂米·特纳 < tturner@example.com >
" jamminjeff@example.com " < jamminjeff@example.com >
苏珊·奥尔德 < suesblues@example.com >,
sallyartist@example.com

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

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

  1. 可以丢弃电子邮件字符串之前的所有内容吗?
  2. 可以丢弃电子邮件字符串之后的所有内容吗?
  3. 是否会找到与需要删除的电子邮件字符串相匹配的任何其他文本?

如果1 和 2 为“是”,3为“”,则在该字符串前面加上^.*<?\b,并在后面加上\b>?.*$

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

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

将其替换为\1@\2将清理整行以仅包含电子邮件地址。

于 2014-04-03T00:40:26.727 回答