我有以下 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
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
要求第一個域和行尾之間沒有任何內容(可能除了空格)。