如何使用jq基于另一个JSON文件的键移除目标文件的键值对
解决方法
要让nl-NL.json只保留en-US.json中存在的键(即获取两者的键交集),可以用以下jq命令实现:
方法一(推荐,jq 1.6及以上版本支持)
jq --argfile en en-US.json 'with_entries(IN(.key; $en | keys[]))' nl-NL.json
命令逻辑:
- 通过
--argfile en en-US.json将en-US.json的内容加载到变量$en中 $en | keys[]提取出en-US.json的所有键with_entries(IN(.key; ...))遍历nl-NL.json的每个键值对,仅保留键存在于en-US.json键列表中的条目
如果需要直接修改nl-NL.json文件(操作前请务必备份原文件),可通过重定向实现:
jq --argfile en en-US.json 'with_entries(IN(.key; $en | keys[]))' nl-NL.json > temp.json && mv temp.json nl-NL.json
方法二(兼容低版本jq)
若你的jq版本低于1.6,不支持IN函数,可改用index判断键是否存在:
jq --argfile en en-US.json '($en | keys) as $keys | with_entries($keys | index(.key) != null)' nl-NL.json
你之前的命令无效原因
jq 'keys'仅输出当前文件的所有键,未执行任何过滤或删除操作jq --slurpfile en en-US.json 'del($en)' nl-NL.json错误在于del需要传入具体的键路径,而$en是整个JSON对象,并非要删除的键列表,因此无法生效
内容的提问来源于stack exchange,提问作者Rogier
相关产品推荐
相关产品推荐

