이메일이 몇 개 있는데 @ 기호 앞의 마지막 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
정규 표현식을 통해 함께 모을 수 있습니다.
가능한 한 많은 문자를 일치시킵니다.
(.*)
두 문자를 일치시킵니다:
(..)
텍스트 @
기호
(@)
단어.
(\.)
그런 다음 해당 성냥을 다른 것으로 바꾸십시오. 우리는 첫 번째 그룹(처음 5자)을 유지하고 싶으므로 인쇄하면 됩니다.
$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**@***.****.******>