Tenho que ser eficiente para não poder usar ferramentas como jq
as 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 -E
para 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