![sed/awk/grep/etc を使用してメールアドレス joebl**@******.*** をブロックする方法 [重複]](https://linux33.com/image/140067/sed%2Fawk%2Fgrep%2Fetc%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%20joebl**%40******.***%20%E3%82%92%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%20%5B%E9%87%8D%E8%A4%87%5D.png)
電子メールがいくつかありますが、@記号の前の最後の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
正規表現を通して一緒に集めることができます。
できるだけ多くの文字を一致させます。
(.*)
2文字を一致させます。
(..)
テキスト@
記号
(@)
言葉.
(\.)
次に、対応するマッチを別のものに置き換えます。最初のグループ(最初の5文字)を維持したいので、印刷するだけです。
$1
*
そして、2番目のグループで見つかった文字ごとに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**@***.****.******>