Como modifico essa solução Perl para que ela substitua as aspas duplas incorporadas por aspas simples?

1

Anteriormente nesta pergunta: " string tendo cotações em dobro entre as cotações "@BernieReiter fez uma pergunta de acompanhamento em que ele queria fazer entradas CSV como as seguintes:

$ cat test.csv
17,"abc","Testurteil "sehr gut"","08/15"
99,"xyz","Testurteil "vernichtend"","4711"

E convertê-los para que, em vez de ter aspas duplas incorporadas ( "..." ), fossem substituídas por aspas simples ( '...' ).

Os resultados devem ficar assim:

17,"abc","Testurteil 'sehr gut'","08/15"
99,"xyz","Testurteil 'vernichtend'","4711"

@BernieReiter também perguntou como ele poderia tomar a solução de @StephaneChazelas que ele forneceu a essa pergunta, onde ele usou essa solução Perl:

$ perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
  s@(^"|"$|\.)|"@$1||"\\""@ge;$r/ge' file.csv

Então, como alguém poderia modificar a solução de Stephane?

    
por slm 28.08.2013 / 04:48

1 resposta

1

A seguinte modificação na solução @ Stephane parece fornecer o que o @BernieReiter estava procurando:

$ perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
  s@(^"|"$|\.)|"@$1||"'\''"@ge;$r/ge' test.csv

A principal coisa a notar na solução Perl original é este subcomponente:

s@(^"|"$|\.)|"@$1||"\\""@ge

Especificamente, este trecho de código:

"\\""

Esse é um bloco de aspas duplas em torno de \\" . Esse é o pedaço da solução original do @Stathane que está substituindo no \" por quaisquer aspas duplas internas. É o que está levando isso:

"Testurteil "sehr gut""

e transformando isso em:

"Testurteil \"sehr gut\""

Então, simplesmente trocar o conteúdo entre as aspas duplas ( "\\"" ) para uma construção de aspas simples é tudo o que é necessário:

"'\''"

OBSERVAÇÃO: É necessário que agrupemos nossas% unicas% em aspas simples para protegê-lo!

Solução final

$ perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
  s@(^"|"$|\.)|"@$1||"'\''"@ge;$r/ge' file.csv

Exemplo

Executar isso transformará o arquivo conforme especificado originalmente.

$ perl -pi.back -le 's/"(?:[^"]|"(?=[^,]))*"|[^",]*/($r=$&)=~
  s@(^"|"$|\.)|"@$1||"'\''"@ge;$r/ge' test.csv

Resultados:

$ more test.csv
17,"abc","Testurteil 'sehr gut'","08/15"
99,"xyz","Testurteil 'vernichtend'","4711"
    
por 28.08.2013 / 04:48