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

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

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 sedvocê 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 .com0 ou mais espaços em branco.


Outras opções:

  • Perl

    perl -ne 'print if /^[^@]+@[^.]+\.com\s*$/' file
    
  • GNUgrep

    grep -P '^[^@]+@[^.]+\.com\s*$' file
    
  • POSIXgrep

    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ó .commas também .frou .ukvocê 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 .xyzapó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.

informação relacionada