Como posso usar (sed | awk) para mascarar um endereço de e-mail com asteriscos como j******e@g***.com

3

Como posso mascarar uma lista de endereços de e-mail como:

John Doe <[email protected]>
John Doe <[email protected]>
Jane Doe <[email protected]>

... com sed (ou awk) em algo como:

John Doe <j******e@g***l.com>
John Doe <j*****e@h*****l.net>
Jane Doe <j***e@o*****k.org>

Em outras palavras: substitua a maior parte do endereço de e-mail por asteriscos, mas torne-o de alguma forma reconhecível pelos usuários que conhecem o endereço de e-mail real.

    
por Martin 16.11.2015 / 16:31

3 respostas

2

Outra versão do Perl:

perl -pe 's/(<.)(.*)(@.)(.*)(.\..*>)/$1."*" x length($2).$3."*" x length($4).$5/e'

Exemplo:

$ perl -pe 's/(<.)(.*)(@.)(.*)(.\..*>)/$1."*" x length($2).$3."*" x length($4).$5/e' foo
John Doe <j*******@g***l.com>
John Doe <j******@h*****l.net>
Jane Doe <j****@o*****k.org>

Com sed , a substituição dos caracteres por um número igual de * é complicada. Consulte esta postagem SO para exemplos que envolvem sed , perl e awk .

    
por 16.11.2015 / 17:12
1

Perl para o resgate:

perl -pe '
    sub asteriskify {
        my $s = shift;
        substr $s, 1, -1, "*" x (length($s) - 2);
        return $s
    }
    s/<(.*)@(.*)(?=\..*>)/
        "<" . asteriskify($1) . "@" . asteriskify($2)
    /e;
' < input > output

O substr substitui os caracteres na string do segundo para o último, mas um por pontos, o número de pontos sendo o comprimento da corda - 2.

A substituição captura o nome de usuário para $ 1 e o nome de domínio sem a parte final para $ 2, a parte ?= apenas garante que ele seja seguido por um ponto, seja qual for e > (consulte Examinar Asserções em perlre ).

    
por 16.11.2015 / 16:54
0

Desde que você perguntou como fazer isso com o awk, eu pensei que iria provar que não era muito difícil. Então aqui vai:

echo "John Doe <[email protected]> John Doe <[email protected]> Jane Doe <[email protected]>" | \
awk \
'
{print repl($0)}

function repl(s, m)
{
  if (match(s,"(<.)([^>]*)(.@.)([^>]*)(.\.[a-z]*>)", m))
  {
    return substr(s, 1, RSTART-1) m[1] \
           gensub(".","*","g",m[2]) m[3] \
           gensub(".","*","g",m[4]) m[5] \
           repl(substr(s,RSTART+RLENGTH))
  }
  else
    return s
}
'
    
por 17.11.2015 / 02:03

Tags