Como posso cortar endereços de e-mail com sed?

3

Eu tenho o seguinte email.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 emails com mais de um .com

Eu não quero esses e-mails:

[email protected]
[email protected];es
[email protected] 
@pepito.com 

Estou preso aqui e não tenho ideia de como obtê-lo.

    
por user420047 14.06.2015 / 16:25

3 respostas

6

Com sed , você poderia fazer:

$ sed -nr '/^[^@]+@[^.]+\.com\s*$/p' file
[email protected]
[email protected]

A regex procura um ou mais caracteres não- @ no início da linha, depois um @ , depois um ou mais caracteres não- . seguidos por .com e, em seguida, 0 ou mais espaço 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
    
por terdon 14.06.2015 / 16:47
5

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 você precise de algo mais "universal" e não apenas .com , mas também .fr ou .uk , você pode usar:

sed -n -r '/\w+@\w+\.\w+$/p' emails.txt

Isso recuperará todos os e-mails no formato [email protected]

    
por user2196728 14.06.2015 / 16:44
3

A expressão ((\.\w+)*)? corresponde a sequências adicionais da forma .xyz após o primeiro domínio. Se você quiser combinar somente os endereços com um único domínio, você poderá impor isso substituindo-o por $ ou (mais robustamente) \s*$

sed -n -r '/\w+@\w+\.\w+\s*$/p' emails.txt

para exigir que não haja nada (exceto possivelmente espaço em branco) entre o primeiro domínio e o fim da linha.

    
por steeldriver 14.06.2015 / 16:47