
Eu tenho um arquivo de texto com um endereço de e-mail por linha. Como posso remover a parte do domínio, mas não a parte do TLD de cada linha? Aqui, definiríamos TLD como o último elemento da string após o último caractere de ponto.
Em outras palavras, amostra de entrada:
[email protected]
[email protected]
[email protected]
[email protected]
Saída desejada:
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
Responder1
$ sed 's/@.*[.]/@/' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
A regex @.*[.]
captura tudo, desde @
o último período .
da linha. Nós substituímos isso por @
.
Responder2
Usandoperl
perl -pe 's/(@).*\.(.*)$/\1\2/' foo
ou embutido
perl -i -pe 's/(@).*\.(.*)$/\1\2/' foo
Exemplo
$ 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
Explicação RegEx
/(@).*\.(.*)$/
1º Grupo de Captura (
@
)@
corresponde ao personagem@
literalmente.*
corresponde a qualquer caractere (exceto nova linha)Quantificador:
*
Entre zero e vezes ilimitadas, quantas vezes for possível, retribuindo conforme necessário [ganancioso]\.
corresponde ao personagem.
literalmente2º Grupo de Captura (
.*
).*
corresponde a qualquer caractere (exceto nova linha)Quantificador:
*
Entre zero e vezes ilimitadas, quantas vezes for possível, retribuindo conforme necessário [ganancioso]$
afirmar a posição no final da string
Responder3
Usando awk
você pode fazer assim
$awk '{ sub(/\@.*\./,"@"); print }' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
Usando sub
Substituto (localizar e substituir), você pode procurar um padrão e substituí-lo.