web-dev-qa-db-ja.com

sed / awk / grep / etcを使用してメールアドレスjoebl**@******。***をマスクする方法

@記号の前の最後の2つを除くすべての文字をマスクし、その後のすべてをマスクしたいメールがいくつかあります。

例えば:

<[email protected]>

必要な出力:

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

これまでのところ、Perlを使用して、次のことを試しました。

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

しかし、それは意図した結果を与えていません。

2
Dang Tran

this非常によく似た質問に与えられた解決策が何を意味するのかを理解し、それらをあなたのケースに適応させることができます。ただし、これまでにPerlに会ったことがない場合、これは非常に困難な場合があることを理解しています。だから、ここにあなたの解決策があります:

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

さあ、行って学びましょう...


質問が編集され、入力データが変更されました。更新された回答は次のとおりです。

echo '<[email protected]>' | Perl -pe 's#..@(.*)#"**@".$1=~s/[^.>]/*/gr#e'
<joebl**@*******.***>
2
simlev
$ Perl -pe 's/(.*)(..)(@)(.*)(\.)(.*)(>)/$1."*" x length($2).$3."*" x length($4).$5 ."*" x length($6).$7/e' file
<joebl**@*******.***>

Perlを使用したことはありませんが、正規表現を使用することはできます。

任意の文字をできるだけ多く一致させます。

(.*)

2つの文字に一致します:

(..)

リテラル@記号

(@)

リテラル.

(\.)

次に、それらの一致を何かに置き換えます。最初のグループ(最初の5文字)を保持したいので、それを印刷するだけです。

$1

そして、2番目のグループで見つけた文字ごとに*を出力します。

"*" x length($2)

残りも同様に続きます。

2
Kevin Kruse

難読化が目標である場合は、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**@***.****.******>
2
glenn jackman