如何使用 (sed|awk) 用星号屏蔽电子邮件地址,例如

如何使用 (sed|awk) 用星号屏蔽电子邮件地址,例如

如何屏蔽电子邮件地址列表,例如:

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

...用 sed (或 awk) 变成类似:

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

换句话说:用星号替换大部分电子邮件地址,但让知道实际电子邮件地址的用户能够以某种方式识别它。

答案1

另一个 Perl 版本:

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

例子:

$ 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>

对于sed,将字符替换为相同数量的*是很复杂的。看这个帖子例如涉及sedperlawk

答案2

Perl 来救援:

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

子字符串将字符串中从第二个到最后一个的字符替换为点,点的数量就是字符串的长度 - 2。

替换将用户名捕获到 $1 ,将域名捕获到 $2,而没有将最后部分捕获到 $2,该?=部分只是确保它后面跟着一个点,无论如何和>(请参阅中的环视断言佩尔雷)。

答案3

既然你问如何用 awk 来做这件事,我想我会证明这并不太难。所以这里是:

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
}
'

答案4

使用 sed:

sed 's/.$//' foo.txt | sed 's#\<\(.\).*\(.@.\).*\(\..*\)#\1***\2***\3#'

第一个 sed 去掉结尾 >,第二个 sed 将屏蔽邮件地址。

输出

J****e@g****.com
J****e@h****.net
J****e@o****.org

相关内容