
Tengo un archivo de texto con una dirección de correo electrónico por línea. ¿Cómo puedo eliminar la parte del dominio pero no la parte del TLD de cada línea? Aquí, definiríamos TLD como el último elemento de la cadena después del último carácter de punto.
En otras palabras, entrada de muestra:
[email protected]
[email protected]
[email protected]
[email protected]
Salida deseada:
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
Respuesta1
$ sed 's/@.*[.]/@/' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
La expresión regular @.*[.]
captura todo, desde @
hasta el último período .
de la línea. Lo reemplazamos con @
.
Respuesta2
Usandoperl
perl -pe 's/(@).*\.(.*)$/\1\2/' foo
o en línea
perl -i -pe 's/(@).*\.(.*)$/\1\2/' foo
Ejemplo
$ cat foo
[email protected]
[email protected]
[email protected]
[email protected]
$ perl -pe 's/(@).*\.(.*)$/\1\2/' foo
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
Explicación de expresiones regulares
/(@).*\.(.*)$/
1er grupo de captura (
@
)@
@
coincide literalmente con el personaje.*
coincide con cualquier carácter (excepto nueva línea)Cuantificador:
*
Entre cero y un número ilimitado de veces, tantas veces como sea posible, retribuyendo según sea necesario [codicioso]\.
.
coincide literalmente con el personaje2do grupo de captura (
.*
).*
coincide con cualquier carácter (excepto nueva línea)Cuantificador:
*
Entre cero y un número ilimitado de veces, tantas veces como sea posible, retribuyendo según sea necesario [codicioso]$
afirmar la posición al final de la cadena
Respuesta3
Usando awk
puedes hacerlo de esta manera.
$awk '{ sub(/\@.*\./,"@"); print }' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
Usando sub
Sustituir (buscar y reemplazar), puede buscar un patrón y reemplazarlo.