2015-04-12 13 views
5

Ich habe versucht zu versuchen, dies für eine Reihe von Tagen zu arbeiten, aber ich bin fest.Probleme beim Suchen und Ersetzen in meinem JSON mit jq

Ich habe eine JSON-Datenstruktur mit Werten, die ich aktualisieren möchte, im Wesentlichen mit meinem JSON als Datenbank zum Speichern von Konfigurationswerten. Hier ist meine JSON:

{ 
    "Actions": [ 
    { 
     "Number": 1012, 
     "RollbackPoint": "xxx_1012_RollbackPoint_xxx", 
     "Parameters": [ 
     { 
      "Name": "accountType", 
      "Value": "xxx_1012_accountType_xxx" 
     }, 
     { 
      "Name": "userPassword", 
      "Value": "xxx_1012_userPassword_xxx" 
     } 
     ] 
    }, 
    { 
     "Number": 1015, 
     "RollbackPoint": "xxx_1015_RollbackPoint_xxx", 
     "Parameters": [ 
     { 
      "Name": "accountType", 
      "Value": "xxx_1015_accountType_xxx" 
     }, 
     { 
      "Name": "skipExport", 
      "Value": "xxx_1015_skipExport_xxx" 
     } 
     ] 
    } 
    ] 
} 

ich zwei Updates

  1. aktualisieren RollbackPoint auf "1012", wo Number = 1015
  2. Update-Wert auf "AWS" ausführen möchten, wo name = "account" unter Parameter, wo Number = 1012

Bisher ist die nächste, die ich gelernt habe ist, mit diesem:

cat json.txt | jq '.[] | map(. + {RollbackPoint:(if (."Number") == 1015 then "1015" else .RollbackPoint end)})' 

Aber diese Streifen für mich, die Aktionen [] Element so sein nicht gut aus, ich weiß nicht, wo sogar auf 2 Update beginnen ...

Jede mögliche Hilfe, über 5 Stunden auf sehr geschätzt google und ich bin immer noch nicht in der nähe.

Vielen Dank Matt

Antwort

8

Sie können den // Operator zu imitieren (IMHO) schöner if-else Bäume in Verbindung mit verschiedenen Filterfilter machen. Es ist im Vergleich zu einem großen if-else-Baum sehr einfach zu verfolgen.

.Actions |= map(
    (select(.Number == 1015) | 
     .RollbackPoint = "1012" 
    ) // 
    (select(.Number == 1012) | 
     .Parameters |= map((select(.Name == "accountType") | .Value = "AWS") // .) 
    ) // 
    . 
) 
+0

Perfect! Vielen Dank Jeff, das wirkt wie ein Zauber. Ich kann sehen, dass ich das jetzt überall benutze. Mit freundlichen Grüßen Matt – msmithwr

+0

@msmithwr Froh, dass Sie Ihre Lösung gefunden haben. Bitte markieren Sie Jeffs Antwort als akzeptiert, um anderen Nutzern zu helfen. – Synesso

0

Hier ist eine weitere jq Lösung

.Actions[] |= (
     if .Number == 1015 then .RollbackPoint = "1012" else . end 
    | if .Number == 1012 then .Parameters[] |= (
     if .Name == "accountType" then .Value = "AWS" else . end 
    ) else . end 
)