如何使用jq命令向JSON文件的vm_map映射追加新条目
jq向JSON对象追加键值对实现方法
需求背景
需要通过jq命令操作JSON文件,向文件中已存在的vm_map空对象内,按键名(如vm1、vm2)追加对应的映射条目,支持每次执行命令新增单条或多条记录,不覆盖原有已存在的条目。
初始文件内容(new_json.json)
{ "gcs_config": [ { "bucket_name": "somebucket", "bucket_readers": [], "bucket_writers": [] } ], "label_application": "someapp", "label_environment": "dev", "lits_vm_zone": "somezone", "project_id": "someproject", "region": "someregion", "storage_bucket_required": true, "vm_map" : {} }
预期最终效果
{ "gcs_config": [ { "bucket_name": "somebucket", "bucket_readers": [], "bucket_writers": [] } ], "label_application": "someapp", "label_environment": "dev", "lits_vm_zone": "zone-a", "project_id": "someproject", "region": "someregion", "storage_bucket_required": true, "vm_map": { "vm1": { "host": "vm1", "network": "10.1.1.1", "name": "vm1" }, "vm2": { "host": "123", "network": "10.1.12", "name": "vm2" } } }
具体实现命令
追加单个条目
通过--arg传入字符串类型的键名,--argjson传入JSON格式的条目值,直接为vm_map下对应键赋值即可,不会影响原有已存在的其他键:
# 追加vm1条目,兼容所有jq版本,通过临时文件写入 jq --arg key "vm1" \ --argjson value '{"host":"vm1","network":"10.1.1.1","name":"vm1"}' \ '.vm_map[$key] = $value' new_json.json > tmp.json && mv tmp.json new_json.json
批量追加多个条目
如果需要一次新增多个条目,使用jq的对象合并运算符*,将原有vm_map和新条目对象合并即可:
# 一次追加vm1、vm2两个条目 jq --argjson new_entries '{ "vm1": {"host": "vm1", "network": "10.1.1.1", "name": "vm1"}, "vm2": {"host": "123", "network": "10.1.12", "name": "vm2"} }' '.vm_map = .vm_map * $new_entries' new_json.json > tmp.json && mv tmp.json new_json.json
合并规则说明:写法
.vm_map * $new_entries中,如果出现重名键,新传入的条目会覆盖旧值;如果需要保留旧值、不覆盖已有同键内容,将合并顺序调整为$new_entries * .vm_map即可。
原地修改简化写法
如果你的jq版本为1.6及以上,可以使用-i参数直接原地修改文件,不需要手动创建临时文件:
# 单条目追加原地修改版 jq -i --arg key "vm1" \ --argjson value '{"host":"vm1","network":"10.1.1.1","name":"vm1"}' \ '.vm_map[$key] = $value' new_json.json # 多条目批量追加原地修改版 jq -i --argjson new_entries '{"vm2": {"host": "123", "network": "10.1.12", "name": "vm2"}}' \ '.vm_map = .vm_map * $new_entries' new_json.json
注意事项
- 传入JSON格式的参数必须使用
--argjson,如果误用--arg,传入的内容会被识别为字符串,破坏JSON结构 - 不推荐使用
+=做对象拼接,低版本jq对对象的+=操作存在兼容问题,使用*运算符做对象合并的兼容性更好
内容的提问来源于stack exchange,提问作者chocokoala
相关产品推荐
相关产品推荐

