GREP Строка в выходе JSON

У меня есть API-запрос, который дает вывод в форме JSON (форма? Макет? Тело? Как вы это говорите? ). Смотрите здесь:

    {
        "title": "Another Life (2019)",
        "alternateTitles": [
            {
                "title": "Another Life",
                "seasonNumber": -1
            }
        ],
        "sortTitle": "another life 2019",
        "seasonCount": 2,
        "totalEpisodeCount": 20,
        "episodeCount": 10,
        "episodeFileCount": 10,
        "sizeOnDisk": 2979171318,
        "status": "continuing",
        "overview": "Astronaut Niko Breckenridge and her young crew face unimaginable danger as they go on a high-risk mission to explore the genesis of an alien artifact.",
        "previousAiring": "2019-07-25T07:00:00Z",
        "network": "Netflix",
        "airTime": "03:00",
        "seasons": [
            {
                "seasonNumber": 1,
                "monitored": true,
                "statistics": {
                    "previousAiring": "2019-07-25T07:00:00Z",
                    "episodeFileCount": 10,
                    "episodeCount": 10,
                    "totalEpisodeCount": 10,
                    "sizeOnDisk": 2979171318,
                    "percentOfEpisodes": 100.0
                }
            },
            {
                "seasonNumber": 2,
                "monitored": true,
                "statistics": {
                    "episodeFileCount": 0,
                    "episodeCount": 0,
                    "totalEpisodeCount": 10,
                    "sizeOnDisk": 0,
                    "percentOfEpisodes": 0.0
                }
            }
        ],
        "tags": [],
        "added": "2020-12-02T15:01:43.942456Z",
        "ratings": {
            "votes": 26,
            "value": 6.0
        },
        "qualityProfileId": 3,
        "id": 24
    }

У меня около 20 из этих выходов в длинном списке. Это один из них.

Проблема

в длинном списке, я буду Grep-ing » \ "title \": \ "Другая жизнь (2019) \" ", где другая жизнь (2019) может быть любой из 20 серий. При необходимости получить идентификатор (в нижней части вывода).

Но делаю grep -eo "\" id \ ": [0-9] {1,4}" не будет работать, так как я бы получил 20 идентификаторов в качестве вывода.

делает grep -eo "\" title \ ": \" Другая жизнь (2019) \ ". * \" ID \ ": [0-9] {1,4}" также не работает.

Doing GreeP -A 100 "\" Название \ ": \" Другая жизнь (2019) \ "" , а затем Grep-int Id также не работает.

Я не могу Получите это, чтобы работать, как я хочу. У меня проблемы вообще понимая, как хватает струны в кузовах JSON.

Если я выберу «devs», я хочу получить идентификатор SE Ries devs. Если я выберу (будь то настроен из переменной или вставкой имени где-то в команду) «тюремный перерыв», я хочу получить удостоверение личности сериала тюремного перерыва.

Спасибо!

2
задан 11 February 2021 в 11:46

1 ответ

Использование --perl-regexp (PCRE) работает на меня:

grep -P -- '"id": \K[0-9]{1,4}' infile.txt

Уведомление \K проигнорирует соответствующую часть, приходящую перед собой ( источник). Если Вам нужны только номера, Вы можете добавить опцию -o:

grep -oP -- '"id": \K[0-9]{1,4}' infile.json

Если Вам нужен многострочный поиск, добавьте опцию -z:

grep -zPo -- '(?s)Another Life.*?"id": \K[0-9]{1,4}\n' infile.json

Где (?s) активировать PCRE_DOTALL, что означает, что "..." находит любой символ или новую строку (-источник).

Вышеприведенная команда выведет все вхождения значения id после строки, содержащей Другой Life. Кажется, что поймать только первое вхождение с помощью grep невозможно, поэтому нам нужно обработать вывод с помощью другого инструмента, скажем, head:

grep -zPo -m1 -- '(?s)Another Life.*?"id": \K[0-9]{1,4}.' infile.json | head -1
1
ответ дан 18 March 2021 в 23:35

Другие вопросы по тегам:

Похожие вопросы: