У меня есть 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. Если я выберу (будь то настроен из переменной или вставкой имени где-то в команду) «тюремный перерыв», я хочу получить удостоверение личности сериала тюремного перерыва.
Спасибо!
Использование --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