이전에이 질문에서 : " 둘러싸는 따옴표를 제외하고 사이에 큰 따옴표가있는 문자열 "@BernieReiter는 다음과 같은 CSV 항목을 가져오고 자하는 후속 질문을했습니다.
$ 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는 또한 그가이 Perl 솔루션을 사용했던 @StephaneChazelas의 솔루션을 어떻게 사용할 수 있는지 물었습니다.
$ perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
s@(^"|"$|\\.)|"@$1||"\\\""@ge;$r/ge' file.csv
그렇다면 Stephane의 솔루션을 어떻게 수정합니까?
@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"
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다