2017-01-16 7 views
0

Ich benutze jq, um cURL Antwort zu analysieren und zu ändern, und es funktioniert perfekt für alle meine Anforderungen außer einer. Ich mag einen Schlüsselwert in der json modifizieren, wie:Bash jq modify json: get und set

A) Eingang json

[ 
    { 
     "id": 169, 
     "path": "dir1/dir2" 
    } 
] 

B) Ausgang json

[ 
    { 
     "id": 169, 
     "path": "dir1" 
    } 
] 

So das letzte Verzeichnis aus dem Pfad entfernt wird. Ich benutze das Skript:

curl --header -X GET -k "${URL}" | jq '[.[] | {id: .id, path: .path_with_namespace}]' | jq '(.[] | .path) = "${.path%/*}"' 

Die letzte Pipe ist natürlich nicht korrekt und das ist, wo ich feststecke. Der Punkt ist, den Wert path zu erhalten und zu ändern. Jede Hilfe wird geschätzt.

Antwort

2

Eine Möglichkeit, dies zu tun, ist split und join zu verwenden, um den Pfad zu verarbeiten und nutzen |= den richtigen Ausdruck zu dem .path Attribute zu binden.

... | jq '.[] | .path|=(split("/")[:-1]|join("/")) 
  • split("/") nimmt einen String und gibt einen Array
  • x[:-1] ein Array zurückgibt aller bestehend aber das letzte Element der x
  • join("/") verbindet die Elemente der ankommenden Array mit / einem einzigen zurückzukehren Zeichenfolge.
  • .path|=x nimmt den Wert .path, führt es durch den Filter x und weist den resultierenden Wert wieder .path zu.
+0

Perfekt, vielen Dank: D – Sid