我有一个 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\": \"Another Life (2019)\""
,其中另一种生活 (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-ing id 也不起作用。
我似乎无法让它按我想要的方式工作。我在一般理解如何在 json 正文中抓取字符串时遇到问题。
如果我选择“Devs”,我想获取系列 Devs 的 id。如果我选择(无论是设置变量还是在命令中的某处插入名称)“越狱”,我想获得越狱系列的 id。
谢谢!
使用
--perl-regexp
(PCRE) 对我有用:\K
通知将忽略其自身之前的匹配部分(源)。如果您只想要数字,您可以添加选项-o
:如果您需要多行搜索,请添加选项
-z
:其中
(?s)
激活PCRE_DOTALL,表示'.' 查找任何字符或换行符(source)。上面的命令将在包含Another Life的行之后输出所有出现的 id 值。似乎不可能只用 捕捉第一次出现
grep
,所以我们需要用另一个工具处理输出,比方说head
: