이와 같은 텍스트 형식이 포함된 텍스트 파일이 있습니다.
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"