이전 질문: "묶는 따옴표 외에도 문자열 사이에 큰따옴표가 있습니다."다음과 같은 CSV 항목을 얻고자 하는 @BernieReiter가 후속 질문을 했습니다.
$ cat test.csv
17,"abc","Testurteil "sehr gut"","08/15"
99,"xyz","Testurteil "vernichtend"","4711"
"..."
삽입된 큰따옴표( ) 대신 작은따옴표()로 변환합니다 '...'
.
결과는 다음과 같아야 합니다.
17,"abc","Testurteil 'sehr gut'","08/15"
99,"xyz","Testurteil 'vernichtend'","4711"
@BernieReiter는 또한 @StephaneChazelas의 솔루션을 문제에 어떻게 적용할 수 있는지 물었고 여기서 그는 이 Perl 솔루션을 사용했습니다.
$ perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
s@(^"|"$|\\.)|"@$1||"\\\""@ge;$r/ge' file.csv
그렇다면 Stephen의 솔루션을 수정하는 방법은 무엇입니까?
답변1
@Stephane의 솔루션에 대한 다음 수정 사항은 @BernieReiter가 찾고 있는 것을 제공하는 것으로 보입니다.
$ perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
s@(^"|"$|\\.)|"@$1||"'\''"@ge;$r/ge' test.csv
원래 Perl 솔루션에서 주목해야 할 핵심 사항은 다음 하위 구성 요소입니다.
s@(^"|"$|\\.)|"@$1||"\\\""@ge
특히 다음 코드는 다음과 같습니다.
"\\\""
이는 큰따옴표 블록으로 둘러싸여 있습니다 \\\"
. 이는 \"
내부 큰따옴표를 대체하는 @Stephane의 원래 솔루션의 일부입니다 . 일어나는 일은 다음과 같습니다.
"Testurteil "sehr gut""
그리고 이것을 다음과 같이 바꾸세요:
"Testurteil \"sehr gut\""
따라서 큰따옴표( ) 사이를 "\\\""
작은따옴표 구조로 바꾸세요.
"'\''"
노트:\'
이를 보호하려면 작은따옴표로 묶어야 합니다 !
마지막 해결책
$ perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
s@(^"|"$|\\.)|"@$1||"'\''"@ge;$r/ge' file.csv
예
이 명령을 실행하면 파일이 원래 지정된 대로 변환됩니다.
$ perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
s@(^"|"$|\\.)|"@$1||"'\''"@ge;$r/ge' test.csv
결과:
$ more test.csv
17,"abc","Testurteil 'sehr gut'","08/15"
99,"xyz","Testurteil 'vernichtend'","4711"