使用 SED 命令检索 JSON 对象键值
Posted
技术标签:
【中文标题】使用 SED 命令检索 JSON 对象键值【英文标题】:Retrieve JSON Object Key Values using SED command 【发布时间】:2021-08-22 10:47:17 【问题描述】:我有一个来自 curl 命令的 JSON,如下所示,它存在于 output.txt 文件中。我想检索 JIRA 状态,这里是“进行中”
"self": "https://jira.com/jira/rest/api/2/issue/1",
"fields":
"status":
"self": "https://jira.com/jira/rest/api/2/status/10170",
"description": "",
"name": "In Progress",
"id": "10170"
我有一个只能使用 sed 的限制。我试过如下它不起作用。我不确定如何导航到名称值。你能建议打印JIRA状态吗
sed -n 's|.*"fields":"status":"name":"\([^"]*\)".*|\1|p' output.txt
【问题讨论】:
jq 似乎更适合处理 JSON (stedolan.github.io/jq) 不幸的是,docker 图像不适用于 jq。我现在无法更改 docker,它仅适用于 sedsed -nE '/"name":/ s/.*"(.+)".*/\1/p'
或 awk -F'"' '/"name":/print $4'
假设在搜索 "name":
时只有一行会匹配
试试sed -n 's/^[[:space:]]*"name": "\(.*\)",/\1/p' file
,见ideone.com/VuKvrY。你真的需要检查fields":"status"
的存在吗?
@WiktorStribiżew - 不是真的
【参考方案1】:
你可以使用
sed -n 's/^[[:space:]]*"name": "\(.*\)",/\1/p' output.txt
# With GNU sed:
sed -n 's/^\s*"name":\s*"\(.*\)",/\1/p' output.txt
见online demo
详情:
n
- 禁止默认行输出
^\s*"name":\s*"\(.*\)",
- 匹配
^
- 字符串开头
\s*
- 零个或多个空格
"name":
- 文字字符串
\s*
- 零个或多个空格
"
- 一个 "
字符
\(.*\)
- 一个 POSIX BRE 捕获组,匹配任何文本,最高可达
",
- 最后一次出现 ",
(无论如何它们都在目标行的末尾)。
\1
- 用第 1 组值替换整个匹配项
p
- 只打印替换结果。
使用 GNU sed
,您还可以使用 -z
选项将文件作为单个字符串读取,然后使用更具体的模式:
sed -z 's/.*"fields":\s*\s*"status": .*\s*name": "\([^"]*\)".*/\1/' output.txt
见this online demo。
它的作用非常接近this demo。
【讨论】:
以上是关于使用 SED 命令检索 JSON 对象键值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter Dart 中迭代 JSON Map 并检索键值结果?