使用jq更新JSON的environment数组时如何保留外层字段不被裁剪
问题原因
你原命令的问题出在管道符|的使用: .taskDefinition | .containerDefinitions[] | .environment |= xxx 这串逻辑会直接丢弃根节点,最终输出的只有environment修改后的容器对象,自然丢失了外层的taskDefinition等所有父级标签。
解决方案
使用逐层更新的写法,直接对根节点下的目标子属性做修改,保留所有外层结构:
jq --arg updateName "user5" --arg updateVal "admin" ' .taskDefinition.containerDefinitions[] |= ( .environment |= ( if any(.[]; .name == $updateName) then map(if .name == $updateName then .value = $updateVal else . end) else . + [{"name": $updateName, "value": $updateVal}] end ) )' envt_values1.json
额外说明
- 如果你的
containerDefinitions数组里只有一个容器、或者你只需要修改第一个容器的environment,可以把.containerDefinitions[]替换成.containerDefinitions[0],避免修改到其他容器的配置。 - 该命令会完整保留原始JSON的所有其他字段,不会出现外层标签丢失的问题,重复执行也不会报错。
内容的提问来源于stack exchange,提问作者Narmada
相关产品推荐
相关产品推荐

