json - 使用 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 `='
Region
env 变量设置为,设置为,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
选项,但找不到解决方案。
解决方案
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
推荐阅读
- python - OpenCV中的Python线程问题
- javascript - 更新 DynamoDB 中的项目(将新项目添加到末尾)
- php - 将后端/网络转换为管理员和前端/网络转换为 myproject/ 时找不到 common/web/js 和 css 404
- hive - 我们如何使用 nifi hive 流处理器将 orcdata 加载到 hive 中
- unit-testing - 无法从测试用例访问房间数据库 - Android
- php - 在 php passthru 中使用变量
- kotlin - 使用 Klaxon 使用动态键解析地图
- spring - 负载平衡器和断路器
- javascript - IE 11 中对 blob 的支持的画布
- angular - 如何防止在.net Angular项目中检查生成的dist文件夹?或者不在项目中生成?