我应该在 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;
结尾,如果我在地址之后得到它那么它总是以 &
开头
用 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
我有一个文件,每行有一个电子邮件地址。其中一些是嘈杂的,即在地址之后 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;
结尾,如果我在地址之后得到它那么它总是以 &
用 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