sed 또는 awk를 사용하여 첫 번째 검색과 두 번째 검색 사이에 있는 문자열의 문자를 바꿉니다.

sed 또는 awk를 사용하여 첫 번째 검색과 두 번째 검색 사이에 있는 문자열의 문자를 바꿉니다.

이메일 주소가 포함된 파일에서 _(밑줄)을 (물음표)로 바꿔야 합니다 .?

파일은 아래와 같습니다.

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

관련 정보