我应该在 bash 脚本中使用什么从文件中的嘈杂行中提取电子邮件地址?

What should I use in bash script to extract email addresses from noisy lines in file?

我有一个文件,每行有一个电子邮件地址。其中一些是嘈杂的,即在地址之后 and/or 之前包含垃圾字符,例如

name.lastname@bar.com<mailto
<someone@foo.bar.baz.edu>
<someone@foo.com>Mobile
<nobody@nowere.com>
<ab@cd.com
no@noise.com

如何在这样的循环中从文件的每一行中提取正确的地址?

for l in `cat file_of_email_addresses`
do
     # do magic here to extract address form $l
done

看起来如果我在地址之前得到垃圾那么它总是以 lt; 结尾,如果我在地址之后得到它那么它总是以 &amp

开头

用 GNU grep 试试:

grep -Po '[\w.-]+@[\w.-]+' file

输出:

name.lastname@bar.com
someone@foo.bar.baz.edu
someone@foo.com
nobody@nowere.com
ab@cd.com
no@noise.com

它并不完美,但也许足以完成您的任务。

最好使用专为模式匹配而构建的工具,例如 sed。正如 Etan 所建议的那样,首先解码数据会有所帮助,但如果您愿意假设

  • 您要删除的前导段将始终以 ;
  • 结尾
  • 您要删除的结尾段将始终以 &
  • 开头
  • 所需地址将不包含这些字符中的任何一个,并且
  • 每一行都恰好包含一个 @,并且在地址中,

那么你可以这样做:

sed 's/^\([^@]*;\)\?\([^&;]*@[^&;]*\).*//' file_of_email_addresses