Cómo escribir una rutina para escapar de comillas dobles en una cadena JSON

Cómo escribir una rutina para escapar de comillas dobles en una cadena JSON

Tengo que ser eficiente para no poder usar herramientas como jqlas que cargan un ejecutable binario grande. Solo quiero evitar las comillas dobles en una cadena para que sea seguro para JSON. Esto no es lo suficientemente bueno:

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

porque escapará de las comillas dobles que ya están escapadas. ¿Hay alguna manera de reemplazar las comillas dobles solo si aún no se han escapado?

Respuesta1

Es de suponer que solo querrás escapar "a menos que esté precedido por \.

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

Explicación

Esto coincidirá con ", pero solo si está precedido por [^\], que es "cualquier carácter excepto \" (o el inicio de la línea ^). Sin embargo, dado que este nuevo personaje será reemplazado por sí mismo, debemos capturarlo en un grupo de captura ()y luego reemplazarlo nuevamente con el correspondiente \1. En este ejemplo, he usado expresiones regulares extendidas con -Epara simplificar.

Respuesta2

$ 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\" \"\"\"\"\"\"\"\"\" \"

utilizando una búsqueda negativa hacia atrás, puede lograr esto.https://www.regular-expressions.info/lookaround.html

información relacionada