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"