У меня есть следующий emails.txt с:
tsar@gmail.com
c2m_@hotmail.com.es
c72@hotmail.com.es.com;es
m7_@hotmail.es.com
cm_@hotmail.com
@pepito.com
И sed управляет для получения
sed -n -r '/\w+@\w+\.\w+((\.\w+)*)?/p' emails.txt
tsar@gmail.com
cm_@hotmail.com
Но, это продолжает отображать электронную почту больше чем с одним .com
Я не хочу эти электронные письма:
c2m_@hotmail.com.es
c72@hotmail.com.es.com;es
m7_@hotmail.es.com
@pepito.com
Я застреваю здесь, и у меня нет подсказки о том, как получить его.
Я использовал бы что-то вроде этого:
sed -n -r '/\w+@\w+\.com$/p' emails.txt
tsar@gmail.com
cm_@hotmail.com
Это получит каждую электронную почту в формате user@xxx.com
В случае, если Вам нужно что-то более "универсальное" а не [только 113], но также и .fr
, или .uk
можно использовать:
sed -n -r '/\w+@\w+\.\w+$/p' emails.txt
Это получит каждую электронную почту в формате user@xxx.xxx
Выражение ((\.\w+)*)?
соответствует дополнительным последовательностям формы .xyz
после первого домена. Если Вы хотите соответствовать [только 115] те адреса с единственным доменом, то можно осуществить это путем замены его $
или (более надежно) \s*$
sed -n -r '/\w+@\w+\.\w+\s*$/p' emails.txt
, чтобы потребовать, чтобы не было ничего (кроме возможно пробела) между первым доменом и концом строки.
С sed
, Вы могли сделать:
$ sed -nr '/^[^@]+@[^.]+\.com\s*$/p' file
tsar@gmail.com
cm_@hotmail.com
regex ищет один или несколько не -@
символы в начале строки, затем a @
, затем один или несколько не -.
символы, сопровождаемые .com
и затем 0 или больше пробелов.
Другой выбор:
Perl
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