首页 > 解决方案 > 使用 jq 更改 json 对象数组中的特定元素

问题描述

我有以下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 文件的一个有效子集,还有一些其他细节,为了简洁起见,这些细节被隐藏了。现在我想为.availabiltyZone: $PREFERRED_ZONE的每个数组元素添加一个项目managedNodeGroups。例如,我希望输出为:

{
    "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 `='

Regionenv 变量设置为,设置为,us-east-1设置为。Zones"\"us-east-1a\",\"us-east-1c\""StackNameexample

如果我只删除命令的最后一部分并执行它,则命令执行得很好。因此,导致问题的是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选项,但找不到解决方案。

标签: jsonjq

解决方案


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


推荐阅读