У меня есть следующие 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]
Регулярное выражение ищет один или несколько не- @
символов в начале строки, затем символ @
, затем один или несколько не- .
символов, за которыми следует символ .com
, а затем 0 или более пробелов.
Другие варианты:
Перл
perl -ne 'print if /^[^@]+@[^.]+\.com\s*$/' file
ГНУ
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
требовать, чтобы между первым доменом и концом строки не было ничего (кроме, возможно, пробелов).