【问题标题】:JQ | Updating array element selected by `select`JQ |更新由`select`选择的数组元素
【发布时间】:2017-12-12 14:10:08
【问题描述】:

在 JSON 数组中,我想根据节点的值选择一个数组元素,然后更新同一数组元素中的不同节点。例如。在下面的 JSON 中:

{
"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[] 的元素设置.enabled = false,其中.name != "rescheduler"。我能做的最接近的是

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
        }
        ]
    }
    }
}
}

我该怎么做呢?提前感谢任何想法或帮助或指导。

【问题讨论】:

    标签: json jq


    【解决方案1】:

    除了缺少一对括号之外,您的 jq 查询是正确的:

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

    即在赋值的LHS上,需要指定需要更新的值的路径。

    【讨论】:

    • 我不知道我可以这样使用括号!感谢您的回答。
    【解决方案2】:

    jq解决方案:

    jq '.properties.orchestratorProfile.kubernetesConfig.addons = 
         [.[] | if .name != "rescheduler" then .enabled = false else . end]' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2013-09-21
      • 2017-11-02
      相关资源
      最近更新 更多