对于那些已经存在的问题,这是一个类似的问题,但找不到具体回答我问题的问题,所以感谢您的任何帮助/见解。
所以我有一个文本文件,我在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
感谢您的任何见解!
答案 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 article,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
它本身就匹配:
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,请在^.*<?\b
前添加该字符串,并将其附加\b>?.*$
。
从行的开头开始,搜索0个或更多字符,可选的左括号,然后是一个开始实际电子邮件地址的字边界。
然后,在电子邮件地址的最后一个字符,可选的结束括号以及直到行尾的零个或多个字符中查找单词边界。
用\1@\2
替换它会清除整行,只包含电子邮件地址。