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

관련 정보