So schreiben Sie eine Routine zum Vermeiden von Anführungszeichen in einer JSON-Zeichenfolge

So schreiben Sie eine Routine zum Vermeiden von Anführungszeichen in einer JSON-Zeichenfolge

Ich muss effizient sein, also kann ich keine Tools wie jqdiese verwenden, die eine große binäre ausführbare Datei laden. Ich möchte nur doppelte Anführungszeichen in einer Zeichenfolge umgehen, damit sie für JSON sicher ist. Das hier ist nicht gut genug:

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

weil es doppelte Anführungszeichen maskiert, die bereits maskiert sind. Gibt es eine Möglichkeit, doppelte Anführungszeichen nur zu ersetzen, wenn sie nicht bereits maskiert sind?

Antwort1

Vermutlich möchten Sie nur entkommen, "wenn nicht zuvor ein vorangegangen ist \.

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

Erläuterung

Dies wird mit übereinstimmen ", aber nur, wenn davor ein steht [^\], was „jedes Zeichen außer \“ (oder der Zeilenanfang ^) ist. Da dieses neue Zeichen jedoch selbst ersetzt wird, müssen wir es in einer Erfassungsgruppe erfassen ()und dann erneut durch die Übereinstimmung ersetzen \1. In diesem Beispiel habe ich -Eder Einfachheit halber erweiterte reguläre Ausdrücke mit verwendet.

Antwort2

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

Durch die Verwendung eines negativen Lookbehinds können Sie dies erreichen.https://www.regular-expressions.info/lookaround.html

verwandte Informationen