
이메일 주소가 포함된 파일에서 _
(밑줄)을 (물음표)로 바꿔야 합니다 .?
파일은 아래와 같습니다.
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
예상되는 출력은 다음과 같습니다.
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
어떻게 해야 하나요?sed또는앗EMAIL+
다른 밑줄에는 영향을 주지 않고 (상수)와 SHR
(상수) 사이의 밑줄만 사용합니다 . 변경된 내용은 새 파일에 저장해야 합니다.
답변1
awk는 다음을 수행합니다.
$ awk '{ gsub("_", "?", $3) ; print }' < data
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
이메일 주소는 필드 3에 있으므로 필드 3에서만 으로 바꿉니다( _
둘 ?
이상이 있는 경우 포함) _
.gsub
.
답변2
당신 과 함께 sed
할 수 있는 일:
sed -e :1 -e 's/_\([^+]*@\)/?\1/;t1'
즉, 바꾸기 뒤에 문자 _
가 아닌 일련의 문자가 뒤따르고 문자 시퀀스가 +
뒤따르는 것이며 @
일치 하는 한 프로세스를 반복합니다.?
EMAIL+
또는 다음 사이에서만 수행하려면 다음을 수행하십시오 SHR
.
sed -e :1 -e 's/\(EMAIL+.*\)_\(.*SHR\)/\1?\2/;t1'
로 시작하는 줄만 고려하려면 를 추가하여 마음에 들지 않는 줄은 그대로 ^EFT
둘 수 있습니다 .-e '/^EFT/!b'
sed -e '/^EFT/!b' -e :1 -e 's/\(EMAIL+.*\)_\(.*SHR\)/\1?\2/;t1'
다음과 같은 입력에 대해 참고하세요.
EFT EMAIL+ foo_bar SHR bar_baz EMAIL+ SHR
EMAIL+
두 밑줄은 모두 an 과 a 사이에 있으므로 대체됩니다 SHR
.
이를 방지하려면 다음과 같이 할 수 있습니다.
sed '
/^EFT/!b # leave the non-EFT lines alone (branch out)
s/%/%p/g; s/</%l/g; s/>/%r/g; # escape the <>% characters with %
s/EMAIL+/</g; s/SHR/>/g; # replace EMAIL+ and SHR with < and >
:1
s/\(<[^<>]*\)_\([^<>]*>\)/\1?\2/; t1
s/</EMAIL+/g; s/>/SHR/g; # restore EMAIL+ and SHR
s/%r/>/g; s/%l/</g; s/%p/%/g; # restore the escaped <>%'
답변3
sed '/.*EMAIL+\(.*\)SHR.*/{
h;s//\1/;y/_/?/;G
s/\(.*\)\n\(.*EMAIL+\).*SHR/\2\1SHR/}'
그러면 작업이 매우 안정적으로 수행됩니다. 한 줄에서 마지막 으로 발생한 것과 마지막 으로 발생한 두 문자열을 모두 포함하는 줄에서만 모든 _
항목을 대체합니다 .?
EMAIL+
SHR