使用 JQ 从 JSON 文件中删除包含特定值的所有对象?
Remove all objects containing a specific value from a JSON file using JQ?
Vivaldi 浏览器(基于 Chromium)的书签文件往往会积累大量 base64 编码的缩略图,占用大量 space,我想删除这些条目。该文件是一个 JSON 文件,条目如下所示:
{
"date_added": "13215828073144281",
"guid": "3ace3174-ea60-42c5-88cf-e535a150ae38",
"id": "74",
"meta_info": {
"Thumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgA....AUpSgFKUoBSlKA//2Q=="
},
"name": "RIPE WHOIS IP Address Database Search › Look up an IP addres… - iTools",
"type": "url",
"url": "http://itools.com/tool/ripe-whois-ip-address"
},
我已经有了一个像这样的 jq 过滤器:
jq 'walk(if type == "object" then with_entries(select(.key | test("Thumbnail") | not)) else . end)' Bookmarks > Bookmarks2
问题是这也会删除包含自定义缩略图的条目,如下所示:
"Thumbnail": "chrome://vivaldi-data/local-image/aa0d8713-99c6-4fcb-a725-a29235c4e8b0",
所以问题是,我如何删除 仅 包含或以字符串 data:image
?
开头的缩略图条目
您可以添加另一个约束 startswith("data:image") | not
和 select
以仅保留 .key
不匹配 or
且 .value
未开始的元素方式,导致:select((.key | test("Thumbnail") | not) or (.value | startswith("data:image") | not))
。您甚至可以应用德摩根定律并将其简化为 select(((.key | test("Thumbnail")) and (.value | startswith("data:image"))) | not)
.
但是,有一个更简单的方法:假设整体结构是一个数组,符合
[
{
"date_added": "13215828073144281",
"guid": "3ace3174-ea60-42c5-88cf-e535a150ae38",
...
},
{
"date_added": "13215828073144282",
"guid": "3ace3174-ea60-42c5-88cf-e535a150ae39",
...
},
...
]
然后只需调用
jq 'map(del(.meta_info.Thumbnail | select(startswith("data:image"))))' Bookmarks
像这样应该可以解决问题:
del(recurse | objects | select(has("Thumbnail")) .Thumbnail | select(startswith("data:image")))
Vivaldi 浏览器(基于 Chromium)的书签文件往往会积累大量 base64 编码的缩略图,占用大量 space,我想删除这些条目。该文件是一个 JSON 文件,条目如下所示:
{
"date_added": "13215828073144281",
"guid": "3ace3174-ea60-42c5-88cf-e535a150ae38",
"id": "74",
"meta_info": {
"Thumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgA....AUpSgFKUoBSlKA//2Q=="
},
"name": "RIPE WHOIS IP Address Database Search › Look up an IP addres… - iTools",
"type": "url",
"url": "http://itools.com/tool/ripe-whois-ip-address"
},
我已经有了一个像这样的 jq 过滤器:
jq 'walk(if type == "object" then with_entries(select(.key | test("Thumbnail") | not)) else . end)' Bookmarks > Bookmarks2
问题是这也会删除包含自定义缩略图的条目,如下所示:
"Thumbnail": "chrome://vivaldi-data/local-image/aa0d8713-99c6-4fcb-a725-a29235c4e8b0",
所以问题是,我如何删除 仅 包含或以字符串 data:image
?
您可以添加另一个约束 startswith("data:image") | not
和 select
以仅保留 .key
不匹配 or
且 .value
未开始的元素方式,导致:select((.key | test("Thumbnail") | not) or (.value | startswith("data:image") | not))
。您甚至可以应用德摩根定律并将其简化为 select(((.key | test("Thumbnail")) and (.value | startswith("data:image"))) | not)
.
但是,有一个更简单的方法:假设整体结构是一个数组,符合
[
{
"date_added": "13215828073144281",
"guid": "3ace3174-ea60-42c5-88cf-e535a150ae38",
...
},
{
"date_added": "13215828073144282",
"guid": "3ace3174-ea60-42c5-88cf-e535a150ae39",
...
},
...
]
然后只需调用
jq 'map(del(.meta_info.Thumbnail | select(startswith("data:image"))))' Bookmarks
像这样应该可以解决问题:
del(recurse | objects | select(has("Thumbnail")) .Thumbnail | select(startswith("data:image")))