Eu tenho o seguinte emails.txt com:
[email protected]
[email protected]
[email protected];es
[email protected]
[email protected]
@pepito.com
E um comando sed para obter
sed -n -r '/\w+@\w+\.\w+((\.\w+)*)?/p' emails.txt
[email protected]
[email protected]
Mas continua exibindo e-mails com mais de um .com
Não quero estes e-mails:
[email protected]
[email protected];es
[email protected]
@pepito.com
Estou preso aqui e não tenho ideia de como consegui-lo.
Responder1
Com sed
você poderia fazer:
$ sed -nr '/^[^@]+@[^.]+\.com\s*$/p' file
[email protected]
[email protected]
A regex procura um ou mais não- @
caracteres no início da linha, depois um @
, depois um ou mais não- .
caracteres seguidos por .com
0 ou mais espaços em branco.
Outras opções:
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
Responder2
Eu usaria algo assim:
sed -n -r '/\w+@\w+\.com$/p' emails.txt
[email protected]
[email protected]
Ele recuperará todos os e-mails no formato[email protected]
Caso precise de algo mais "universal" e não só .com
mas também .fr
ou .uk
você pode usar:
sed -n -r '/\w+@\w+\.\w+$/p' emails.txt
Isto irá recuperar todos os e-mails no formato[email protected]
Responder3
A expressão ((\.\w+)*)?
corresponde a sequências adicionais da forma .xyz
após o primeiro domínio. Se você quiser combinarapenasesses endereços com um único domínio, então você pode impor isso substituindo-o por $
ou (de forma mais robusta)\s*$
sed -n -r '/\w+@\w+\.\w+\s*$/p' emails.txt
exigir que não haja nada (exceto possivelmente espaços em branco) entre o primeiro domínio e o final da linha.