【问题标题】:change a particular element inside array of json objects using jq使用 jq 更改 json 对象数组中的特定元素
【发布时间】:2020-05-17 05:59:32
【问题描述】:

我有以下 json:

{
    "kind": "ClusterConfig",
    "managedNodeGroups": [
      {
        "name": "default-nodegroup",
        "instanceType": "t3.medium"
      },
      {
        "name": "elk-master-nodegroup",
        "instanceType": "t3.medium"
      },
      {
        "name": "elk-data-nodegroup",
        "instanceType": "t3.medium"
      }
    ]
}

上面的 json 是一个大 json 文件的一个有效子集,还有一些其他细节,为了简洁起见,这些细节被隐藏了。现在我想在managedNodeGroups 的每个数组元素中添加一个项目availabiltyZone: $PREFERRED_ZONE。例如,我希望输出为:

{
    "kind": "ClusterConfig",
    "managedNodeGroups": [
      {
        "name": "default-nodegroup",
        "instanceType": "t3.medium",
        "availabilityZone": "us-east-1a"
      },
      {
        "name": "elk-master-nodegroup",
        "instanceType": "t3.medium",
        "availabilityZone": "us-east-1a"
      },
      {
        "name": "elk-data-nodegroup",
        "instanceType": "t3.medium",
        "availabilityZone": "us-east-1a"
      }
    ]
}

我正在尝试的 jq 命令和错误是:

$ jq --arg CONTR_CLUSTER_NAME "My-${StackName}" --arg CONTR_CLUSTER_REGION "${Region}"  --arg ZONES ${Zones} --arg PREFERRED_ZONE "${Region}-a" '.metadata.name = $CONTR_CLUSTER_NAME | .metadata.region = $CONTR_CLUSTER_REGION | .availabilityZones = ($ZONES|split(","))' | (.managedNodeGroups[] | .preferredZone ) = $PREFERRED_ZONE tmp.json 
bash: syntax error near unexpected token `='

Region 环境变量设置为us-east-1,Zones 设置为"\"us-east-1a\",\"us-east-1c\"",StackName 设置为example。

如果我只删除命令的最后一部分并执行它,则该命令可以正常执行。因此,将PREFERRED_ZONE 附加到managedNodeGroups 数组的每个元素会导致问题。例如,以下命令可以正常工作:

jq --arg CONTR_CLUSTER_NAME "My-${StackName}" --arg CONTR_CLUSTER_REGION "${Region}"  --arg ZONES ${Zones} --arg PREFERRED_ZONE "${Region}-a" '.metadata.name = $CONTR_CLUSTER_NAME | .metadata.region = $CONTR_CLUSTER_REGION | .availabilityZones = ($ZONES|split(","))' tmp.json 
{
    "kind": "ClusterConfig",
    "managedNodeGroups": [
      {
        "name": "default-nodegroup",
        "instanceType": "t3.medium"
      },
      {
        "name": "elk-master-nodegroup",
        "instanceType": "t3.medium"
      },
      {
        "name": "elk-data-nodegroup",
        "instanceType": "t3.medium"
      }
    ]
}

我在这里做错了什么?我缺少某种 foreach 来遍历数组元素,但无法从文档中弄清楚。我什至尝试了map, select 选项,但找不到解决方案。

【问题讨论】:

    标签: json jq


    【解决方案1】:

    Q 中显示的 jq 过滤器的引号位置不正确。

    使用 input.json 中的输入数据,以下调用成功:

    jq --arg CONTR_CLUSTER_NAME "My-${StackName}" --arg CONTR_CLUSTER_REGION "${Region}"  --arg ZONES "${Zones}" --arg PREFERRED_ZONE "${Region}-a" '
      .metadata.name = $CONTR_CLUSTER_NAME
      | .metadata.region = $CONTR_CLUSTER_REGION
      | .availabilityZones = ($ZONES|split(","))
      | (.managedNodeGroups[] | .preferredZone ) = $PREFERRED_ZONE
    ' input.json
    
    

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      相关资源
      最近更新 更多