如何屏蔽电子邮件地址列表,例如:
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
,将字符替换为相同数量的*
是很复杂的。看这个帖子例如涉及sed
、perl
和awk
。
答案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