Tengo que ser eficiente para no poder usar herramientas como jq
las 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 -E
para 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