sed를 사용하여 한 줄에 여러 개의 큰따옴표로 묶인 단어의 문자를 바꾸는 방법은 무엇입니까?

sed를 사용하여 한 줄에 여러 개의 큰따옴표로 묶인 단어의 문자를 바꾸는 방법은 무엇입니까?

이와 같은 텍스트 형식이 포함된 텍스트 파일이 있습니다.

012345,"[ThinkPadT2/3Gband,Mac]",Lenovo,"iPhone3G,A1241"

sed를 사용하여 파이프(|) 연산자를 통해 큰따옴표 안에 있는 단어 내 쉼표만 바꾸는 방법입니다. 다음과 같은 출력이 필요합니다.

012345,"[ThinkPadT2/3Gband | Mac]",Lenovo,"iPhone3G|A1241"

답변1

이는 표준 제작 절차입니다.sed 욕심이 없다그리고역참조괄호 안의 하위 문자열에 대한 힌트()

sed 's/\(\"[^",]\{1,\}\),\([^",]\{1,\}\"\)/\1 | \2/g'

아니면 GNU의 경우sed

sed -r 's/("[^",]+),([^",]+")/\1 | \2/g'

답변2

다음과 같이 시도해 볼 수 있습니다.

$ cat filename
012345,"[ThinkPadT2/3Gband,Mac]",Lenovo,"iPhone3G,A1241"

$ cat filename | sed -E 's:([A-Z,a-z]),([A-Z,a-z]):\1|\2:g'
012345,"[ThinkPadT2/3Gband|Mac]",Lenovo,"iPhone3G|A1241"

답변3

Sed는 이러한 목적에 적합한 도구가 아닙니다. 위와 같은 기능을 구현하려면 몇 가지 고급 기능이 필요할 수도 있다고 생각합니다. 이것은 큰따옴표 안에 있는 여러 개의 이중 쉼표를 대체하는 Perl 온라인 프로그램입니다 <space>|<space>.

$ echo '012345,"[ThinkPadT2/3Gband,Mac,Apple]",Lenovo,"iPhone3G,A1241"' | perl -pe 's/,(?!(?:"[^"]*"|[^"])*$)/ | /g'
012345,"[ThinkPadT2/3Gband | Mac | Apple]",Lenovo,"iPhone3G | A1241"

관련 정보