이메일 주소의 사용자 부분 문자 바꾸기

이메일 주소의 사용자 부분 문자 바꾸기

다음과 같은 목록이 있습니다.

[email protected]
[email protected]
[email protected]
...

사용자 이름 부분에 나타나는 점을 바꾸고 싶습니다. 하도록 하다:

[email protected] 

이 되다:

user^[email protected]

sed를 사용해 보았지만 사용자 이름 부분에만 변경 사항을 적용하기 위해 정규식을 함께 넣을 수 없었습니다. 이 일을 할 생각이 있나요?

답변1

사용 awk:

awk -F"@" '{gsub("\.","^",$1)}OFS="@"' file
  • -F"@"별도 입력 @.
  • gsub()^첫 번째 필드 $1(이름 앞 부분 )의 모든 점을 바꿉니다 @.
  • OFS출력 필드 구분 기호를 설정합니다.

답변2

점이 여러 개 있지만 @ 기호(일반적인 경우) 뒤에 점이 하나만 있는 경우 모든 점을 변경하고 마지막 점을 다시 변경할 수 있습니다.

sed 'y/./^/;s/\(@.*\)\^/\1./'

@ 기호 앞뒤에 점이 여러 개 있을 수 있는 경우 짧은 루프를 사용하여 이 작업을 재귀적으로 수행할 수 있습니다.

sed ':top;s/\.\(.*@\)/^\1/;ttop'

이는 GNU sed에서 작동합니다. BSD sed에는 레이블 뒤에 개행 문자가 필요합니다.

sed ':top 
s/\.\(.*@\)/^\1/;ttop'

편집하다:한 줄 명령으로 GNU sed 또는 BSD sed의 모든 사례를 처리하려면 다음을 수행하십시오.

sed 'h;s/@.*//;y/./^/;G;s/\n.*@/@/'

h현재 줄("패턴 공간"이라고 함)을 예약된 공간에 복사합니다. 이 s명령은 쉘 명령과 유사하게 @모든 것을 삭제합니다. 이 경우 모든 점을 캐럿으로 변환합니다. 패턴 공간에 추가합니다. ; 그런 다음 마지막 명령은 개행 문자부터 모든 내용을 제거 하고 다시 넣습니다 .ytrGs@@

답변3

포인트가 1개만 있으면 사용할 수 있습니다.

sed 's/\.\(.*\)@/^\1@/'

포인트를 일치시킨 다음 나머지를 캡처하고 까지 @대체하고 ^캡처하고 @.

답변4

sed 및 awk가 있는 시스템에는 일반적으로 Perl도 있습니다. Perl 솔루션을 사용하려는 경우 다음을 시도하십시오.

perl -ne '($user, $domain) = split "@"; $user =~ s/\./^/g; print "$user\@$domain"'

귀하의 이메일 주소가 상당히 평범하고 한 줄에 하나의 주소만 포함한다면(다른 것은 아무것도 없음) 간단한 방법으로 이를 수행할 수 있습니다. 주소를 로 나누고 @첫 번째 부분의 모든 마침표를 캐럿으로 바꾼 다음 두 부분을 바꿉니다. 부품을 이메일 주소로 함께 인쇄하세요.

까다로워서 다음을 수행할 수도 있습니다.

perl -pe 's/\.(?=.*@)/^/g'

@정규식을 사용하여 기호 앞의 마침표를 캐럿으로 바꿉니다 . 내가 아는 한, 이는 sed 또는 awk의 정규식 버전에서 아직 구현되지 않은 기능인 예측 어설션에 의존합니다. 긴 목록의 경우 속도가 느려질 수 있다고 생각하지만 자체 테스트를 실행하고 그것이 중요한지 확인하십시오.

관련 정보