다음과 같은 목록이 있습니다.
[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
명령은 쉘 명령과 유사하게 @
모든 것을 삭제합니다. 이 경우 모든 점을 캐럿으로 변환합니다. 패턴 공간에 추가합니다. ; 그런 다음 마지막 명령은 개행 문자부터 모든 내용을 제거 하고 다시 넣습니다 .y
tr
G
s
@
@
답변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의 정규식 버전에서 아직 구현되지 않은 기능인 예측 어설션에 의존합니다. 긴 목록의 경우 속도가 느려질 수 있다고 생각하지만 자체 테스트를 실행하고 그것이 중요한지 확인하십시오.