(sed | awk)を使用してアスタリスク付きのメールアドレスをブロックする方法(例:

(sed | awk)を使用してアスタリスク付きのメールアドレスをブロックする方法(例:

次のメールアドレスのリストをブロックするには:

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>

つまり、ほとんどのEメールアドレスをアスタリスクに置き換えますが、実際のEメールアドレスを知っているユーザーが識別できるようにします。

答え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番目から最後の文字をドットに置き換えます。点の数は文字列の長さ(2)です。

置き換えは、最後の部分を$ 2にキャプチャせず、ユーザー名を$ 1に、ドメイン名を$ 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は>で終わる文字を削除し、2番目のsedは電子メールアドレスをブロックします。

出力

J****e@g****.com
J****e@h****.net
J****e@o****.org

関連情報