2016-04-20 10 views
3

Wie ist es möglich, eine Zeichenkette genau so wiederzugeben, wie sie in einer While-Read-Schleife ist?Bash: exakte Wiedergabe von maskierten Anführungszeichen in einer JSON-Datei

Hier ist das spezifische Beispiel.

Ich lese eine JSON-Datei: {"key":"value with a \"quote\" inside"} und diese Rohrleitung in eine while-Leseschleife:

echo "{\"key\":\"value with a \\\"quote\\\" inside\"}" | jq -rc '.' | while read line; do echo "$line"; done 

Dies ist die Ausgabe Ich sehe:

{"key":"value with a "quote" inside"} 

Die Zitate in dem Feld verschwinden nach dem Echo. Ich möchte diese Escape-Zeichen beibehalten, also habe ich nach möglichen Lösungen gesucht und ich vermute, dass printf helfen kann (Escape FileNames Using The Same Way Bash Do It). Durch die Änderung echo-printf '%q':

echo "{\"key\":\"value with a \\\"quote\\\" inside\"}" | jq -rc '.' | while read line; do printf '%q' "$line"; done 

ich folgendes:

\{\"key\":\"value\ with\ a\ \"quote\"\ inside\"\} 

Leider jetzt die bisher unescaped Anführungszeichen entkam auch (zusätzlich zu allen anderen entweicht). Können Sie mir sagen, wie ich die folgende Ausgabe innerhalb einer while read Schleife erreichen kann?

{"key":"value with a \"quote\" inside"} 
+2

Verwendung 'lesen -r' nicht Schrägstriche – jandob

+0

@jandob zu interpretieren: Thank you! Könnten Sie das als eine Antwort verwenden, die ich akzeptieren werde? Es klappt! :) – econ

Antwort

4
echo "{\"key\":\"value with a \\\"quote\\\" inside\"}" | while read -r line 
do 
    echo "$line" 
done 

Arbeiten für mich. Mit dem Schalter -r interpretiert read keine umgekehrten Schrägstriche. Aber

echo '{"key":"value with a \"quote\" inside"}' | while read -r line 
do 
    echo "$line" 
done 

funktioniert auch

+0

Ja, du hast recht, ich wollte nur ein paar Backslashes eliminieren. Korrigiert es oben ... – jandob