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"