我有一个 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 搜索"\"title\": \"Another Life (2019)\""
,其中 Another Life (2019) 可以是 20 个系列中的任何一个。需要获取 id(在输出的底部)。
但这样做grep -Eo "\"id\": [0-9]{1,4}"
不会起作用,因为我会得到 20 个 Id 作为输出。
做grep -Eo "\"title\": \"Another Life (2019)\".*\"id\": [0-9]{1,4}"
也是不行。
执行完grep -A 100 "\"title\": \"Another Life (2019)\""
之后再 grep id 也不起作用。
我似乎无法让它按我想要的方式工作。我总体上无法理解如何抓取 JSON 主体中的字符串。
如果我选择“Devs”,我想获取系列 Devs 的 ID。如果我选择(无论是设置变量还是在命令中的某个位置插入名称)“Prison Break”,我想获取系列 Prison Break 的 ID。
谢谢!
答案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 值另一种生活。似乎不可能只捕获第一次出现的grep
,所以我们需要用另一个工具来处理输出,比如说head
:
grep -zPo -m1 -- '(?s)Another Life.*?"id": \K[0-9]{1,4}.' infile.json | head -1