Escape-Zeichen in bash (für JSON)
Bin ich mit git, dann die Buchung der commit-Nachricht und die anderen bits als JSON-payload an einen server.
Derzeit habe ich:
MSG=`git log -n 1 --format=oneline | grep -o ' .\+'`
setzt MSG etwas wie:
Calendar can't go back past today
dann
curl -i -X POST \
-H 'Accept: application/text' \
-H 'Content-type: application/json' \
-d "{'payload': {'message': '$MSG'}}" \
'https://example.com'
Mein real JSON hat ein paar Felder.
Dies funktioniert gut, aber natürlich, wenn ich eine commit-Nachricht wie die oben mit einem Apostroph, der JSON ist ungültig.
Wie kann ich entkommen der gewünschten Zeichen in der bash? Ich bin nicht vertraut mit der Sprache, so bin mir nicht sicher wo zu beginnen. Ersetzen '
mit \'
würde den job tun, zu mindestens vermute ich.
InformationsquelleAutor der Frage Rich Bradshaw | 2012-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit Python:
Diese Lösung ist nicht Reine bash, aber es ist nicht-invasiv und behandelt unicode.
Beachten Sie, dass JSON ist Teil der standard-python-Bibliotheken und hat für eine lange Zeit gewesen, so ist dies ein ziemlich minimal python-Abhängigkeit.
Oder mit PHP:
Verwenden, etwa so:
InformationsquelleAutor der Antwort polm23
Anstatt sich Gedanken darüber, wie Sie richtig zitieren, die Daten in einer Datei speichern und verwenden Sie die
@
Konstrukt, dascurl
ermöglicht mit der--data
option. Um sicherzustellen, dass die Ausgabe vongit
ist korrekt escaped für den Einsatz als JSON-Wert, verwenden Sie ein tool wiejq
zum generieren des JSON, anstatt es manuell.Können Sie auch direkt von der Standardeingabe mit
-d @-
; das überlasse ich als übung für den Leser, um die Leitung zu bauen, liest ausgit
und erzeugt das richtige Nutzlast-Nachricht upload mitcurl
.(Hinweis: es ist
jq ... | curl ... -d@- 'https://example.com'
)InformationsquelleAutor der Antwort chepner
War ich auch versucht zu escape-Zeichen in der Bash, für die übertragung per JSON, wenn stieß ich auf diese. Ich fand, dass es tatsächlich eine größere Liste von Zeichen, die mit Escapezeichen versehen werden müssen – vor allem, wenn Sie versuchen, zu behandeln free form text.
Gibt es zwei Tipps, die ich nützlich fand:
${string//substring/replacement}
syntax beschrieben in diesem thread.Den daraus resultierenden Bash Ersatz kam ich mit sind wie folgt:
Habe ich in diesem Stadium nicht so geklappt hat, wie zu entkommen, die Unicode-Zeichen korrekt, das ist auch (scheinbar) erforderlich ist. Ich update meine Antwort, wenn ich diese Arbeit heraus.
InformationsquelleAutor der Antwort xsgordon
OK, finden Sie heraus, was zu tun ist. Die Bash unterstützt das nativ als erwartet, obwohl, wie immer, die syntax ist nicht wirklich sehr guessable!
Im wesentlichen
${string//substring/replacement}
gibt, was man Bild, so dass Sie verwenden können,Dazu. Das nächste problem ist, dass die erste regex funktioniert nicht mehr, aber das kann ersetzt werden mit
Am Ende, ich hatte es nicht einmal nötig, Ihnen zu entkommen. Stattdessen habe ich nur getauscht, alle ' in der JSON \". Tja, man lernt jeden Tag etwas.
InformationsquelleAutor der Antwort Rich Bradshaw
Die obige Zeile funktioniert bei mir. finden
https://github.com/stedolan/jq für mehr
jq
toolsInformationsquelleAutor der Antwort wcy
Der einfachste Weg ist, mit jshonein Kommandozeilen-tool zum analysieren, Lesen und erstellen von JSON -.
jshon -s 'Your data goes here.' 2>/dev/null
InformationsquelleAutor der Antwort m-szalik
Fand ich, dass so etwas wie :
InformationsquelleAutor der Antwort user907860
Hatte ich die gleiche Idee: senden einer Nachricht mit commit-Nachricht nach dem commit.
Zuerst habe ich versucht ähnlich war als autor hier.
Aber später fand eine bessere und einfachere Lösung.
Gerade erstellte php-Datei, die Sie senden die Nachricht und rufen Sie es mit wget.
in hooks/post-receive :
in git.php:
Erstellen und dann JSON und CURL-Aufruf im PHP-Stil
InformationsquelleAutor der Antwort KirillDE
Dies ist eine Flucht-Lösung mit Perl, entweicht backslash (
\
), doppeltes Anführungszeichen ("
) und steuerzeichenU+0000
zuU+001F
:InformationsquelleAutor der Antwort Josh Bode
jq
kann dies tun.Konvertieren von string zu JSON
Erklären,
-a
bedeutet "ascii-output"-R
bedeutet "raw-input".
bedeutet "Ausgang der Wurzel des JSON-Dokument"<<<
ist nur ein Weg, um eine Zeichenfolge übergeben, die in stdinGit + Curl Use-Case -
Beheben Sie das code Beispiel von der OP, einfach Rohr durch jq.
InformationsquelleAutor der Antwort jchook