Substituir caracteres na parte do usuário do endereço de e-mail

2

Eu tenho uma lista assim:

[email protected]
[email protected]
[email protected]
...

Eu gostaria de substituir qualquer ocorrência de um ponto na parte do nome de usuário. Então isso:

[email protected] 

torna-se:

user^[email protected]

Eu tentei com sed mas não consegui juntar um Regex para aplicar a alteração apenas na parte do nome de usuário. Você tem uma ideia de um padrão para fazer isso?

    
por valh 27.10.2015 / 09:11

5 respostas

3

Se houver mais de um ponto, mas apenas um ponto após o sinal @ (o que seria normal), você poderá alterar todos os pontos e alterar o último ponto de volta:

sed 'y/./^/;s/\(@.*\)\^/./'

Se houver mais de um ponto antes e depois do sinal @, você poderá fazer isso recursivamente com um loop curto:

sed ':top;s/\.\(.*@\)/^/;ttop'

Isso funciona no GNU sed; O BSD sed requer uma nova linha após um rótulo:

sed ':top 
s/\.\(.*@\)/^/;ttop'

EDIT: Para lidar com todos os casos no sed GNU ou no BSD sed em um único comando de linha:

sed 'h;s/@.*//;y/./^/;G;s/\n.*@/@/'

h copia a linha atual (chamada de "espaço de padrão") para o espaço de espera; o comando s exclui o @ e tudo depois dele; y funciona como o comando shell tr e, nesse caso, converte todos os pontos em carets; G acrescenta uma nova linha e o conteúdo do espaço de espera ao espaço padrão; em seguida, o último comando s excluirá da nova linha até o @ e retornará o @ .

    
por 27.10.2015 / 09:38
4

Use awk :

awk -F"@" '{gsub("\.","^",$1)}OFS="@"' file
  • -F"@" delimita a entrada com @ .
  • gsub() substitui todos os pontos por ^ no primeiro campo $1 (a parte do nome antes do @ ).
  • OFS define o separador do campo de saída.
por 27.10.2015 / 09:26
3

Se você tiver apenas um ponto, poderá usar

sed 's/\.\(.*\)@/^@/'

que corresponde ao ponto, depois captura o restante até o @ e o substitui por ^ , a captura e @ .

    
por 27.10.2015 / 09:16
2

É assim que eu faria com sed .

sed ':start s/^\([^@]*\)\./^/; t start;' "$@"

:start é um rótulo para ser desviado para.

^\([^@]*\)\. é uma expressão regular (aka regex ), que corresponde, no início da linha, a 0 ou mais de qualquer caractere, exceto o arroba, seguido por um ponto. O \( e \) significam uma referência anterior , o que significa que qualquer coisa que corresponda ao padrão incluído pode ser referenciada no lado da substituição com .

^ é a substituição . é substituído pelo que corresponde a \([^@]*\) na expressão regular. O circunflexo (^) substituirá o ponto cujo aviso foi excluído da referência anterior.

t é um teste que irá se ramificar para o rótulo dado se a subsituição anterior foi bem sucedida. Isso permite que o script substitua mais de um ponto no endereço de e-mail.

    
por 27.10.2015 / 09:36
0

Um sistema que tenha sed e awk também terá perl e, se você estiver aberto a uma solução perl, tente

perl -ne '($user, $domain) = split "@"; $user =~ s/\./^/g; print "$user\@$domain"'

Contanto que seus endereços de e-mail sejam bastante normais e cada linha contenha um endereço (e nada mais), isso funciona de maneira direta: divida o endereço em @ , substitua todos os pontos da primeira parte por carets e imprima as duas partes juntas como um endereço de e-mail.

Você também pode ser complicado e fazer isso:

perl -pe 's/\.(?=.*@)/^/g'

que usa uma expressão regular para substituir qualquer período que anteceda um símbolo @ por um acento circunflexo. Ele se baseia em uma afirmação lookahead, um recurso que não é implementado nos sabores de expressões regulares do sed ou do awk, até onde eu sei. Eu acho que isso pode ser mais lento para longas listas, mas execute seus próprios testes e veja se isso é importante.

    
por 27.10.2015 / 17:06