如何使用Bash向JSON对象列表中追加新对象
在CI环境中用Bash追加JSON对象到现有数组
现有模板内容(含Terraform语法的伪JSON)
[ { "name" : "server", "image" : "server:latest", "essential" : true, "environment" : concat( [ { "name" : "TZ", "value" : "${var.env_timezone}" } ], [ for key, value in var.env_for_server: { "name" : key, "value" : value } ] , "portMappings" : [ { "hostPort" : 3000, "protocol" : "tcp", "containerPort" : 3000 } ], }, { "name" : "client", "image" : "client:latest" }, { "name" : "nginx_gateway", "image" : "nginx_gateway:latest", "essential" : true, "portMappings" : [ { "hostPort" : 80, "protocol" : "tcp", "containerPort" : 80 } ] } ]
待添加的对象
{ "name": "sidecar", "image": "sidecar:latest", "essential": true }
失败的尝试
之前用jq命令无法完成合并:
jq '. += [input]' existing_containers.json new_container.json > updated_containers.json
解决方法
现有文件不是标准JSON,包含Terraform的concat()和for循环语法,jq无法解析这类模板代码,改用sed做文本替换:
直接插入固定对象
# Linux系统 sed -i '$i\ },\ { "name": "sidecar", "image": "sidecar:latest", "essential": true }' existing_containers.json # macOS系统(需指定备份文件后缀) sed -i.bak '$i\ },\ { "name": "sidecar", "image": "sidecar:latest", "essential": true }' existing_containers.json
从文件读取对象插入
如果新对象存在于new_container.json中,用以下命令:
# Linux sed -e '$i\ },' -e '$e cat new_container.json' existing_containers.json > updated_containers.json # macOS sed -e '$i\ },' -e "$(printf '\\n')"'$e cat new_container.json' existing_containers.json > updated_containers.json
内容的提问来源于stack exchange,提问作者David Tayar
相关产品推荐
相关产品推荐

