(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>

즉, 대부분의 이메일 주소를 별표로 바꾸되 실제 이메일 주소를 아는 사용자가 식별할 수 있도록 만드세요.

답변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, perlawk.

답변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로 캡처하지 않고 사용자 이름을 $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는 >로 끝나는 문자를 제거하고 두 번째 sed는 이메일 주소를 차단합니다.

산출

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

관련 정보