次の 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
GNU
grep
grep -P '^[^@]+@[^.]+\.com\s*$' file
POSIX
grep
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
最初のドメインと行の末尾の間に何も(空白以外)ないことを要求します。