如何使用 sed 剪切电子邮件地址?

如何使用 sed 剪切电子邮件地址?

我有以下 emails.txt 文件:

[email protected]
[email protected]
[email protected];es
[email protected]
[email protected]
@pepito.com 

并使用 sed 命令获取

sed -n -r '/\w+@\w+\.\w+((\.\w+)*)?/p' emails.txt 

[email protected]
[email protected] 

但是,它一直显示包含多个 .com 的电子邮件

我不想要这些电子邮件:

[email protected]
[email protected];es
[email protected] 
@pepito.com 

我被困在这里,不知道该如何得到它。

答案1

使用sed,你可以执行以下操作:

$ sed -nr '/^[^@]+@[^.]+\.com\s*$/p' file
[email protected]
[email protected]

@正则表达式在行首查找一个或多个非字符,然后查找 ,然后查找@一个或多个非字符,然后查找 0 个或多个空格。..com


其他选择:

  • Perl

    perl -ne 'print if /^[^@]+@[^.]+\.com\s*$/' file
    
  • GNUgrep

    grep -P '^[^@]+@[^.]+\.com\s*$' file
    
  • POSIXgrep

    grep -E '^[^@]+@[^.]+\.com\s*$' file
    
  • awk

    awk '$0~/^[^@]+@[^.]+\.com\s*$/' file
    

答案2

我会用这样的东西:

sed -n -r '/\w+@\w+\.com$/p' emails.txt

[email protected]
[email protected]

它将以以下格式检索每封电子邮件[email protected]

如果您需要更“通用”的东西,不仅.com如此,.fr或者.uk您可以使用:

sed -n -r '/\w+@\w+\.\w+$/p' emails.txt

这将检索格式为[email protected]

答案3

该表达式((\.\w+)*)?匹配第一个域之后的其他序列.xyz。如果要匹配仅有的那些地址只有一个域名,那么你可以通过用$或(更强大)替换它来强制执行\s*$

sed -n -r '/\w+@\w+\.\w+\s*$/p' emails.txt

要求第一个域和行尾之间没有任何内容(可能的空格除外)。

相关内容