首页 > 解决方案 > 使用 jq 删除 JSON 结构中的选择元素

问题描述

我想删除与搜索条件匹配的 JSON 文件中的某些元素,同时保留 JSON 结构的其余部分。我希望匹配和删除的元素是 .chapter 数组中的一个对象 - .tags.title 包含文本 #MKR#

我知道如何使用以下方法选择正确的元素:

jq -r '.chapters[] | select(.tags.title | contains("#MKR#"))' metadata.json

但不知道如何选择和删除这些元素,同时保持结构的其余部分完好无损。

示例输入 JSON - metadata.json:

    {
        "chapters": [
            {
                "id": 0,
                "time_base": "1/3000",
                "start": 0,
                "start_time": "0.000000",
                "end": 9200,
                "end_time": "3.066667",
                "tags": {
                    "title": "Start"
                }
            },
            {
                "id": 1,
                "time_base": "1/3000",
                "start": 9200,
                "start_time": "3.066667",
                "end": 15000,
                "end_time": "5.000000",
                "tags": {
                    "title": "Example(1) #MKR#"
                }
            },
            {
                "id": 2,
                "time_base": "1/3000",
                "start": 15000,
                "start_time": "5.000000",
                "end": 18900,
                "end_time": "6.300000",
                "tags": {
                    "title": "Example(2)"
                }
            },
            {
                "id": 3,
                "time_base": "1/3000",
                "start": 18900,
                "start_time": "6.300000",
                "end": 124299,
                "end_time": "41.433000",
                "tags": {
                    "title": "Example(3) #MKR#"
                }
            },
            {
                "id": 4,
                "time_base": "1/3000",
                "start": 124299,
                "start_time": "41.433000",
                "end": 225700,
                "end_time": "75.233333",
                "tags": {
                    "title": "Example(4) #MKR#"
                }
            },
            {
                "id": 5,
                "time_base": "1/3000",
                "start": 225700,
                "start_time": "75.233333",
                "end": 231900,
                "end_time": "77.300000",
                "tags": {
                    "title": "Example(5) #MKR#"
                }
            }

        ],
        "format": {
            "filename": "video_mkr_temp.mp4",
            "nb_streams": 3,
            "nb_programs": 0,
            "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
            "format_long_name": "QuickTime / MOV",
            "start_time": "0.000000",
            "duration": "968.300000",
            "size": "399977859",
            "bit_rate": "3304577",
            "probe_score": 100,
            "tags": {
                "major_brand": "mp42",
                "minor_version": "512",
                "compatible_brands": "isomiso2avc1mp41",
                "creation_time": "2020-04-12T00:46:21.000000Z"
            }
        }
    }

我想要实现的示例输出 JSON:

 {
        "chapters": [
            {
                "id": 0,
                "time_base": "1/3000",
                "start": 0,
                "start_time": "0.000000",
                "end": 9200,
                "end_time": "3.066667",
                "tags": {
                    "title": "Start"
                }
            },
            {
                "id": 2,
                "time_base": "1/3000",
                "start": 15000,
                "start_time": "5.000000",
                "end": 18900,
                "end_time": "6.300000",
                "tags": {
                    "title": "Example(2)"
                }
            },
        ],
        "format": {
            "filename": "video_mkr_temp.mp4",
            "nb_streams": 3,
            "nb_programs": 0,
            "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
            "format_long_name": "QuickTime / MOV",
            "start_time": "0.000000",
            "duration": "968.300000",
            "size": "399977859",
            "bit_rate": "3304577",
            "probe_score": 100,
            "tags": {
                "major_brand": "mp42",
                "minor_version": "512",
                "compatible_brands": "isomiso2avc1mp41",
                "creation_time": "2020-04-12T00:46:21.000000Z"
            }
        }
    }

任何想法都非常感谢。

谢谢

标签: jsonjq

解决方案


您可以使用以下内容过滤掉您的章节:

jq '.chapters |= map(select(.tags.title | contains("#MKR#") | not))' metadata.json

-r选项仅在过滤器输出为字符串时才有用,而此处为 json 对象。


推荐阅读