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

안녕

이전에이 질문에서 : " 둘러싸는 따옴표를 제외하고 사이에 큰 따옴표가있는 문자열 "@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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관