Regex 使用sed脚本仅打印有效的电子邮件条目
emaillist.txtRegex 使用sed脚本仅打印有效的电子邮件条目,regex,linux,validation,email,sed,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 我想打印有效的电子邮件地址,但我很难解决这个问题。到目前为止,我有这个脚本,但它没有打印完全正确
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
首先,需要一个匹配所有有效电子邮件地址的正则表达式。考虑到测试数据,我将假设您的目标是更简单的电子邮件地址有效性概念 正则表达式的一个问题是,行首不匹配,行首用
^
表示。这允许无效电子邮件(如用户名中带有符号的电子邮件)匹配,因为它只匹配符号后面的所有内容。因此,如果我们添加^
,我们将得到以下输出:
$ sed -nr '/^\w+@\w+\.\w+$/p' emaillist.txt
saman_desilva@tamucc.edu
这也不对,现在的问题是\w
只包含任何字母、数字或下划线。句点是测试数据中用户名的另一个“有效”非字母数字字符,因此我们还需要调整模式以添加句点,现在我们得到正确的输出:
$ sed -nr '/^(\w|\.)+@\w+\.\w+$/p' emaillist.txt
Saman.desilva@tamucc.edu
saman_desilva@tamucc.edu
Saman.desilva@gmail.com
您希望如何彻底验证电子邮件?有一个相当著名的问题,其中的示例表达式非常复杂,我不愿意尝试将其转换为
sed
(即使启用了“扩展正则表达式”),尽管理论上它可能能够处理它。您显示的输出是您期望的输出,还是您得到的输出?您应该澄清您希望从输入中输出哪些电子邮件地址。一个问题是,您没有将电子邮件地址的开头锚定为^
,因此无论是谁。whom@wherever@由于whoever@somewhere.com
是有效的(当前缀不是where.where@
时),但是您的正则表达式不能防止这种情况。顺便说一句:这是一个有效的电子邮件地址,太:recipient@[1.2.3.4]
。