如何使用bash/jq将JSON对象以文件名为键添加到另一JSON对象中
实现方法
直接用jq配合bash原生语法就能完成这个JSON合并需求,不需要额外依赖。
单文件合并命令
针对你给出的country1.json合并场景,直接执行以下命令即可:
country_file="country1.json" jq --arg key "${country_file%.json}" --slurpfile country_content "$country_file" '. + {($key): $country_content[0]}' world.json > world_country1.json
命令说明
${country_file%.json}是bash内置的字符串截断语法,直接去掉文件名末尾的.json后缀,得到country1作为新增字段的键名,不需要调用额外的文本处理命令--slurpfile country_content "$country_file"会把目标country文件的完整JSON内容读取到jq的内部变量中,slurp模式读取的结果是数组,取第一个元素就是文件内存储的完整JSON对象- 合并逻辑是在原world.json的对象基础上,追加一个键为去后缀文件名、值为country文件完整内容的字段,最终输出到新的
world_country1.json文件
执行后生成的文件内容和你给出的预期结果完全一致:
{ "class": "world", "version": "1.1.0", "country1": { "class": "country", "country_1": { "class": "city", "name": "seattle" } } }
批量合并扩展
如果后续需要合并多个同规则的country文件,直接套bash循环即可,比如合并当前目录下所有country*.json文件:
# 先复制原始world文件作为基础 cp world.json world_merged.json for f in country*.json; do # 逐个合并,临时文件避免读写冲突 jq --arg key "${f%.json}" --slurpfile cd "$f" '. + {($key): $cd[0]}' world_merged.json > tmp.json && mv tmp.json world_merged.json done
内容的提问来源于stack exchange,提问作者Romain
相关产品推荐
相关产品推荐

