2016-08-09 6 views
3

die folgenden JSON-Datei foo.js (abgespeckte für Klarheit) Gegeben:JQ Mit einem Wert mit einem anderen Wert aus demselben Wörterbuch ersetzen

{"a":{"b":[{"x":{"x1":1},"y":{"y1":5}},{"x":{"x1":1},"y":{"y1":6}}]}} 

ich den Wert von x1 mit dem entsprechenden Wert ersetzt werden soll von y1. Das heißt, ich möchte am Ende mit:

{"a":{"b":[{"x":{"x1":5},"y":{"y1":5}},{"x":{"x1":6},"y":{"y1":6}}]}} 

Diese Werte ersetzt, sondern gibt nur die modifizierten Wörterbücher anstatt die vollständige JSON-Datei:

% jq -Mc '.a.b[] | .x.x1 = .y.y1' foo.js 
{"x":{"x1":5},"y":{"y1":5}} 
{"x":{"x1":6},"y":{"y1":6}} 

Dies funktioniert x1 mit einer Konstante ersetzen Wert:

% jq -Mc '(.a.b[] | .x.x1) |= 9' foo.js 
{"a":{"b":[{"x":{"x1":9},"y":{"y1":5}},{"x":{"x1":9},"y":{"y1":6}}]}} 

Aber dieser Versuch die gleiche Idee zu verwenden, funktioniert nicht:

% jq -Mc '(.a.b[] | .x.x1) |= .y.y1' foo.js 
jq: error (at foo.js:1): Cannot index number with string "y" 

Antwort

5

Sie haben es fast verstanden. Verwenden Sie diese Option:

.a.b[] |= (.x.x1 = .y.y1) 

Wir alle Elemente in der .a.b Array aktualisiert werden soll, wo .x.x1 den Wert von .y.y1

+0

Perfect, dank nimmt. Jetzt, um es wieder in die echte Datendatei zu stecken. –

Verwandte Themen