파이프로 구분된 파일의 한 필드에서 내부 큰따옴표를 바꾸는 방법

파이프로 구분된 파일의 한 필드에서 내부 큰따옴표를 바꾸는 방법

PSV 파일이 있습니다.

$ cat hello.txt 
123|"xy"|11|"sb" sri"|13|"bb" 
123|"xy"|11|"rss" "NIL"|13|"bb"   

네 번째 필드에서는 내부 큰따옴표를 다른 문자( )로 바꾸고 싶습니다 W.

제가 시도한 방법은 다음과 같습니다. 그러나 원하는 결과를 얻지 못했습니다.

$ sed '/"|/s/[^|]|/W|/4' hello.txt 
123|"xy"|11|"sb" sriW|13|"bb" 
123|"xy"|11|"rss" "NILW|13|"bb"  

hello.txt출력이 아래 파일과 같기를 원합니다 .

$ cat hello.txt 
123|"xy"|11|"sbW sri"|13|"bb" 
123|"xy"|11|"rssW WNIL"|13|"bb"

답변1

다른 관점에서 보면,

123|"xy"|11|"sb" sri"|13|"bb" 
123|"xy"|11|"rss" "NIL"|13|"bb"

파이프로 구분된 네 번째 필드를 추출하려고 합니다.

cut -f4 -d'|' < test

"sb" sri"
"rss" "NIL"

그러면 필드 내부에 따옴표가 있을 수 있으므로 바깥쪽 쌍을 제거하세요.

cut -f4 -d'|' < test | sed -e 's/^"\(.*\)"/\1/g'

sb" sri
rss" "NIL

나머지 따옴표를 모두 W 기호로 바꿉니다.

cut -f4 -d'|' < test | sed -e 's/^"\(.*\)"/\1/g' | tr '"' 'W'

sbW sri
rssW WNIL

마지막으로 외부 따옴표를 다시 교체하십시오.

cut -f4 -d'|' < test | sed -e 's/^"\(.*\)"/\1/g' | tr '"' 'W' \
    | sed -e 's/\(.*\)/"\1"/g'

"sbW sri"
"rssW WNIL"

답변2

파이프로 구분된 파일의 네 번째 필드에 있는 "내부 큰따옴표"를 바꾸려는 것 같습니다 W. 이 작업은 다음을 사용하여 수행할 수 있습니다 awk.

awk 'BEGIN{FS=OFS="|"} {gsub(/^\"|\"$/,"",$4);gsub(/\"/,"W",$4);$4="\"" $4 "\""}1' hello.txt

이 명령은 먼저 네 번째 필드에서 왼쪽 및 오른쪽 큰따옴표를 제거한 다음 나머지 큰따옴표를 로 바꾸고 W텍스트 주위에 왼쪽 및 오른쪽 큰따옴표를 다시 추가합니다.

결과:

123|"xy"|11|"sbW sri"|13|"bb" 
123|"xy"|11|"rssW WNIL"|13|"bb"

관련 정보