如何将JSON文件中的指定块复制到另一个JSON文件?
解决方案
先明确目标文件内容:
foo.json
{ "name": "foo", "block": { "one": 1, "two": "2" }, "otherData": { "two": 1, "one": "2" } }
bar.json
{ "name": "bar" }
要实现将foo.json的block节点合并到bar.json中,你的原命令存在两个问题:
--argjson的参数用单引号包裹了$(jq '.block' ./foo.json),shell不会解析单引号内的命令插值,导致传入的是字符串而非合法JSON;. += [$block]会把数据以数组元素的形式追加,不符合预期的对象合并需求。
下面是两种可行的一行命令:
方法一:通过slurp模式合并两个文件
jq -s '.[1] + {block: .[0].block}' foo.json bar.json | sponge bar.json
-s参数会把所有输入的JSON文件读入一个数组,.[0]对应foo.json的内容,.[1]对应bar.json的内容;+操作符用于合并两个JSON对象,将foo的block节点添加到bar的对象中。
方法二:通过参数传递单个节点
jq --argjson block "$(jq '.block' foo.json)" '.block = $block' bar.json | sponge bar.json
- 先用
jq '.block' foo.json提取出block的JSON内容; - 通过
--argjson将该JSON内容作为参数传入主jq命令,直接为bar.json的对象添加block字段并赋值。
执行任意一种命令后,bar.json都会变成预期的结构:
{ "name": "bar", "block": { "one": 1, "two": "2" } }
内容的提问来源于stack exchange,提问作者leonheess
相关产品推荐
相关产品推荐

