이메일 주소가 포함된 파일에서 _
(밑줄)을 (물음표)로 바꿔야 합니다.?
파일은 다음과 같습니다.
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