포함된 큰따옴표를 작은따옴표로 바꾸도록 이 Perl 솔루션을 수정하려면 어떻게 해야 합니까?

포함된 큰따옴표를 작은따옴표로 바꾸도록 이 Perl 솔루션을 수정하려면 어떻게 해야 합니까?

이전 질문: "묶는 따옴표 외에도 문자열 사이에 큰따옴표가 있습니다."다음과 같은 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"

관련 정보