我有一些电子邮件,我想屏蔽除 @ 符号之前的最后 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**@***.****.******>