2017-12-12 26 views
2

JSON配列では、ノードの値に基づいて配列要素を選択し、同じ配列要素内の別のノードを更新したいと考えています。例えば。下記のJSONに:JQ | `select`で選択した配列要素を更新する

{ 
"apiVersion": "vlabs", 
"properties": { 
    "orchestratorProfile": { 
    "orchestratorType": "Kubernetes", 
    "orchestratorRelease": "1.7", 
    "orchestratorVersion": "1.7.10", 
    "kubernetesConfig": { 
     "kubernetesImageBase": "gcrio.azureedge.net/google_containers/", 
     "clusterSubnet": "10.105.208.0/20", 
     "networkPolicy": "calico", 
     "nonMasqueradeCidr": "10.0.0.0/8", 
     "maxPods": 110, 
     "dockerBridgeSubnet": "172.17.0.1/16" 
     "addons": [ 
     { 
      "name": "tiller", 
      "enabled": true 
     }, 
     { 
      "name": "aci-connector", 
      "enabled": true 
     }, 
     { 
      "name": "kubernetes-dashboard", 
      "enabled": true 
     }, 
     { 
      "name": "rescheduler", 
      "enabled": true 
     } 
     ] 
    } 
    } 
} 
} 

私はすなわち、「予定変更」ではありませんすべてのアドオンを無効にするアレイ.properties.orchestratorProfile.kubernetesConfig.addons[].name != "rescheduler"の要素について.enabled = falseを設定します。私は仕事ができる最も近い私は常に配列の外にデータを失う、

jq -r '.properties.orchestratorProfile.kubernetesConfig.addons[] | 
    select (.name != "rescheduler") | .enabled = false' 

が、この、または私が試した他の方法でした。

期待される結果は次のとおりです。

{ 
"apiVersion": "vlabs", 
"properties": { 
    "orchestratorProfile": { 
    "orchestratorType": "Kubernetes", 
    "orchestratorRelease": "1.7", 
    "orchestratorVersion": "1.7.10", 
    "kubernetesConfig": { 
     "kubernetesImageBase": "gcrio.azureedge.net/google_containers/", 
     "clusterSubnet": "10.105.208.0/20", 
     "networkPolicy": "calico", 
     "nonMasqueradeCidr": "10.0.0.0/8", 
     "maxPods": 110, 
     "dockerBridgeSubnet": "172.17.0.1/16" 
     "addons": [ 
     { 
      "name": "tiller", 
      "enabled": false 
     }, 
     { 
      "name": "aci-connector", 
      "enabled": false 
     }, 
     { 
      "name": "kubernetes-dashboard", 
      "enabled": false 
     }, 
     { 
      "name": "rescheduler", 
      "enabled": true 
     } 
     ] 
    } 
    } 
} 
} 

は、どのように私はこれをやって行くのですか?どんなアイデアや助けや指導も前もって評価されます。

答えて

3

あなたJQクエリは、本質的に括弧の不足しているペアを除くスポットオンであります割り当ての中で、更新が必要な値のパスを指定する必要があります。

+0

私はこのようにかっこを使用することはできませんでした!答えをありがとう。 – Amit

1

JQソリューション:LHSに、

(.properties.orchestratorProfile.kubernetesConfig.addons[] 
| select (.name != "rescheduler").enabled) = false 

です:

jq '.properties.orchestratorProfile.kubernetesConfig.addons = 
    [.[] | if .name != "rescheduler" then .enabled = false else . end]' file 
関連する問題