¿Cómo puedo cortar direcciones de correo electrónico con sed?

¿Cómo puedo cortar direcciones de correo electrónico con sed?

Tengo el siguiente email.txt con:

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

Y un comando sed para obtener

sed -n -r '/\w+@\w+\.\w+((\.\w+)*)?/p' emails.txt 

[email protected]
[email protected] 

Pero sigue mostrando correos electrónicos con más de un .com.

No quiero estos correos electrónicos:

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

Estoy atrapado aquí y no tengo idea de cómo conseguirlo.

Respuesta1

Con sed, podrías hacer:

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

La expresión regular busca uno o más @caracteres que no sean al principio de la línea, luego un @, luego uno o más .caracteres que no sean seguidos de .comy luego 0 o más espacios en blanco.


Otras opciones:

  • perla

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

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

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

    awk '$0~/^[^@]+@[^.]+\.com\s*$/' file
    

Respuesta2

Yo usaría algo como esto:

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

[email protected]
[email protected]

Recuperará todos los correos electrónicos en formato[email protected]

En caso de que necesites algo más "universal" y no solo .comsino también .frpuedes .ukusar:

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

Esto recuperará cada correo electrónico en formato[email protected]

Respuesta3

La expresión ((\.\w+)*)?coincide con secuencias adicionales de la forma .xyzdespués del primer dominio. Si quieres coincidirsoloesas direcciones con un solo dominio, entonces puede hacer cumplir eso reemplazándolo con $o (de manera más sólida)\s*$

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

para exigir que no haya nada (excepto posiblemente espacios en blanco) entre el primer dominio y el final de la línea.

información relacionada