如何使用 sed/awk/grep/etc 屏蔽电子邮件地址 joebl**@******.***

如何使用 sed/awk/grep/etc 屏蔽电子邮件地址 joebl**@******.***

我有一些电子邮件,我想屏蔽除 @ 符号之前的最后 2 个字符之外的所有字符,并屏蔽之后的所有字符。

例如:

<[email protected]>

期望的输出:

<joebl**@******.***>

到目前为止,使用perl,我尝试过:

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

但它没有给出预期的结果。

答案1

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

从未使用过perl,但我可以通过正则表达式拼凑出我的方式。

尽可能多地匹配任意字符:

(.*)

匹配两个字符:

(..)

文字@符号

(@)

文字.

(\.)

然后用一些东西替换那些匹配项。我们想要保留第一组(前 5 个字符),所以只需打印它:

$1

*并为我们在第二组中找到的每个字符打印一个:

"*" x length($2)

其余依此类推。

答案2

您可以尝试了解所给出的解决方案 非常相似问题的意思,并根据您的情况进行调整。我知道,如果您以前从未接触过 Perl,那么这可能是一个相当大的挑战。所以,这是您的解决方案:

echo [email protected] | perl -pe 's#..@(.*)#"**@".$1=~s/[^.]/*/gr#e'
joebl**@*******.***

现在,就去学习吧……


问题已被编辑,输入数据已更改。这是更新的答案:

echo '<[email protected]>' | perl -pe 's#..@(.*)#"**@".$1=~s/[^.>]/*/gr#e'
<joebl**@*******.***>

答案3

如果混淆是您的目标,您可能不想向查看者提供有关 TLD 和域的字符串长度的任何线索:尝试仅使用固定数量的星号:

perl -pe 's/..\@.*/**\@******/g'

根据修订后的要求进行更新我阅读了评论:

email="blah blah <[email protected]> blah blah <[email protected]>"

echo "$email" | perl -pe 's/<.*?\K..\@[^>]+/**\@****/g'
blah blah <joebl**@****> blah blah <ging**@****>

或者用 simlev 保留点的想法:

$ perl -pe 's{<.*?\K..\@([^>]+)}{ ($tmp = $1) =~ s/[^.]/*/g; "**\@$tmp" }eg' <<<"$email"
blah blah <joebl**@*******.***> blah blah <ging**@***.****.******>

相关内容