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]

正規表現は、@行の先頭で 1 つ以上の 文字以外の文字を検索し、次に を検索し@、次に 1 つ以上の.文字以外の文字を検索し.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

最初のドメインと行の末尾の間に何も(空白以外)ないことを要求します。

関連情報