Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed脚本仅打印有效的电子邮件条目_Regex_Linux_Validation_Email_Sed - Fatal编程技术网

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

Regex 使用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 我想打印有效的电子邮件地址,但我很难解决这个问题。到目前为止,我有这个脚本,但它没有打印完全正确

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

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

正则表达式的一个问题是,行首不匹配,行首用
^
表示。这允许无效电子邮件(如用户名中带有符号的电子邮件)匹配,因为它只匹配符号后面的所有内容。因此,如果我们添加
^
,我们将得到以下输出:

$ 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]