如何使用 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]

@正規表示式在行首查找一個或多個非字符,然後查找 a @,然後.查找一個或多個非字符,.com最後查找 0 個或多個空格。


其他選擇:

  • 珀爾

    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

要求第一個域和行尾之間沒有任何內容(可能除了空格)。

相關內容