使用sed脚本仅打印有效的电子邮件条目

时间:2018-11-27 02:53:41

标签: regex linux validation email sed

emaillist.txt

1. Saman.desilva@tamucc.edu
2. saman_desilva@tamucc.edu
3. saman&desilva@tamucc.edu
4. Saman.desilva@gmail.com
5. saman@desilva@yahoo.com
6. saman@mail@com
7. saman.desilva@yahoo com

我想打印有效的电子邮件地址,但无法解决此问题。到目前为止,我已经有了此脚本,但是它无法显示完全正确的输出。仍然给我一个错误的输出。

sed -nr '/\w+@\w+\.\w+$/p' emaillist.txt

输出:

saman.desilva@tamucc.edu 
saman_desilva@tamucc.edu
saman&desilva@tamucc.edu 
Saman.desilva@gmail.com
saman@desilva@yahoo.com

1 个答案:

答案 0 :(得分:0)

首先,与所有有效电子邮件地址匹配的正则表达式为notoriously complex。考虑到测试数据,我将假设您的目标是一个更简单的电子邮件地址有效性概念。

您的正则表达式存在一个问题,即您与行首没有匹配,该行以^表示。这样可以匹配无效的电子邮件(例如,用户名中带有“&”号的电子邮件),因为它只匹配“&”号之后的所有内容。因此,如果我们添加^,则会得到以下输出:

$ sed -nr '/^\w+@\w+\.\w+$/p' emaillist.txt
saman_desilva@tamucc.edu

那也不对,现在的问题是\wrepresents任何字母,数字或下划线。句点是测试数据中用户名的另一个“有效”非字母数字字符,因此我们还需要调整您的模式以添加它,现在我们获得了正确的输出:

$ sed -nr '/^(\w|\.)+@\w+\.\w+$/p' emaillist.txt
Saman.desilva@tamucc.edu
saman_desilva@tamucc.edu
Saman.desilva@gmail.com