Debug-Fälle wie diesen, ist es am besten, Dinge zu brechen in den Basiskomponenten zuerst. In Ihrem Fall würde ich raten Sie den jq Filter sein soll:
[.field1,.field2] | "\(.[0]), \(.[1])"
Zum Test:
jq -r -c '[.field1,.field2] | "\(.[0]), \(.[1])"'
{"field1": 1, "field2": 2}
1, 2
Sobald Sie diesen Teil Recht haben, ist der Rest einfach. Vorausgesetzt, Sie verwenden eine anständige Shell, könnten Sie wahrscheinlich das Leben einfach für sich selbst machen, indem Sie $()
statt "$()"
verwenden, oder die Befehlsersetzung insgesamt zu vermeiden.
Von der Entwicklung und Erprobung Sicht könnte es sinnvoll, das jq Programm zu setzen, die Sie wissen, in eine Datei korrekt zu sein, sagen program.jq, und dann können Sie in der Reihenfolge:
(a) verifizieren Sie es im Standalone-Modus, indem Sie jq -r -c -f program.jq
verwenden. (b) Schließen Sie den jq-Aufruf an Ihre Pipeline an, um sicherzustellen, dass es an keinem anderen Ort ein anderes Problem gibt.
Wenn die Verwendung von "program.jq" letztendlich nicht zufriedenstellend ist, sollten Sie in Erwägung ziehen, eine Shell-Variable auf das jq-Programm zu setzen, z.
JQ='[.field1,.field2] | "\(.[0]), \(.[1])"'
echo $(jq -r -c "$JQ")
Natürlich ist die letzte Zeile oben nur zum Testen da. Vielleicht brauchst du gar nicht $()
?
'echo" $ (einige Befehle) "' ist fast immer ein Fehler und kompliziert das Zitat hier. Warum nicht die Befehle direkt ausführen und die Erfassung und Ausgabe der Ausgabe überspringen? –
Was hoffst du '\" (. [0]), (. [1]) "' würde tun? – tripleee
Sie wissen, dass keine geschweiften Klammern erforderlich sind? Sie brauchen sie nur, wenn das nächste Zeichen Teil eines gültigen Variablennamens ist. Wie oben, nicht sicher, warum Sie nur ein Doppelzitat entkommen lassen? – grail