다음과 같은 이메일 주소 목록을 차단하는 방법:
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
, 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로 캡처하지 않고 사용자 이름을 $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