如何用jq删除JSON中值不包含指定字符串的元素?
如何用jq删除JSON中值不包含"val"的元素?
原始JSON内容
json1.json的内容如下:
{ "a":"val1", "b":"val2", "nest1": { "z": "x", "test": "containval" } }
需求
生成新的JSON,删除所有值不包含"val"的元素(支持任意嵌套层级的属性)。
之前的尝试及问题
你之前使用的命令:
jq 'del(.. | select(. == "val1"))' .\json1.json
输出结果:
{ "b": "val2", "nest1": { "z": "x", "test": "containval" } }
这个命令仅会删除值等于"val1"的元素,无法满足“删除值不包含val”的需求。
正确的jq命令
可以使用walk函数递归处理所有层级的对象,筛选出符合条件的键值对:
jq 'walk(if type == "object" then with_entries(select(.value | test("val"))) else . end)' json1.json
命令解释
walk(...):递归遍历JSON结构中的每一个元素if type == "object" then ... else . end:只对对象类型的元素进行处理,非对象元素保持原样with_entries(select(.value | test("val"))):对对象的每个键值对进行筛选,只保留值中包含"val"子串的条目(test("val")用于字符串的包含匹配)
执行结果
运行上述命令后,会得到期望的输出:
{ "a":"val1", "b":"val2", "nest1": { "test": "containval" } }
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

