![sed를 사용하여 한 줄에 여러 개의 큰따옴표로 묶인 단어의 문자를 바꾸는 방법은 무엇입니까?](https://linux55.com/image/46673/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%95%9C%20%EC%A4%84%EC%97%90%20%EC%97%AC%EB%9F%AC%20%EA%B0%9C%EC%9D%98%20%ED%81%B0%EB%94%B0%EC%98%B4%ED%91%9C%EB%A1%9C%20%EB%AC%B6%EC%9D%B8%20%EB%8B%A8%EC%96%B4%EC%9D%98%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이와 같은 텍스트 형식이 포함된 텍스트 파일이 있습니다.
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"