Como escrever rotina para escapar de aspas duplas em uma string JSON

Como escrever rotina para escapar de aspas duplas em uma string JSON

Tenho que ser eficiente para não poder usar ferramentas como jqas que carregam um grande executável binário. Eu só quero escapar de aspas duplas em uma string para que seja seguro para JSON. Isso não é bom o suficiente:

echo ' bad \"  string"' | sed 's/"/\\"/g' 

porque escapará de aspas duplas que já escaparam. Existe uma maneira de substituir aspas duplas somente se elas ainda não tiverem escapado?

Responder1

Presumivelmente, você só deseja escapar, "a menos que seja precedido por \.

echo ' bad \"  string"' | sed -E 's/([^\]|^)"/\1\\"/g'

Explicação

Isso corresponderá a ", mas somente se for precedido por [^\], que é "qualquer caractere exceto \" (ou o início da linha ^). No entanto, como esse novo caractere será substituído, precisamos capturá-lo em um capture group ()e substituí-lo novamente pelo match \1. Neste exemplo, usei expressões regulares estendidas -Epara simplificar.

Responder2

$ echo ' bad \"  string"' | perl -pe 's/(?<!\\)"/\\\"/g'
 bad \"  string\"
$ echo ' bad \"  string" """""""""' | perl -pe 's/(?<!\\)"/\\\"/g'
 bad \"  string\" \"\"\"\"\"\"\"\"\"
$ echo ' bad \"  string" """"""""" \"' | perl -pe 's/(?<!\\)"/\\\"/g'
 bad \"  string\" \"\"\"\"\"\"\"\"\" \"

usando lookbehind negativo, você pode conseguir isso.https://www.regular-expressions.info/lookaround.html

informação relacionada