【问题标题】:Retrieve JSON Object Key Values using SED command使用 SED 命令检索 JSON 对象键值
【发布时间】: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 - 不是真的

标签: json ubuntu sed


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多