使用 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,它仅适用于 sed sed -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 对象键值的主要内容,如果未能解决你的问题,请参考以下文章

[677]. 键值映射

如何在 Flutter Dart 中迭代 JSON Map 并检索键值结果?

如何通过键值从firebase中检索对象

如何获取自己键盘上按键的键值(KeyCode)

使用 Spring boot 解析具有无效键值的 JSON 对象

Java标准库中的键值,键值类[重复]