如何在 shell 脚本中使用 sed 在 JSON 中获取第一个 "id"?

How to get first one "id" in a JSON using sed in shell script?

'''[ {
        "id": "**49b18e99-7516-4c9a-8e1a-9d28f470512**",
        "name": "Name",
        "appId": "",
        "publishTime": "2020-05-17",
        "published": true,
        "stream": {
            "id": "aaec8d41-5201-43ab809f-3063750dffff",
            "name": "name",
            "privileges": null
        },
        "savedInProductVersion": "12.0",
        "migrationHash": "qewjhjkw-djqwhndj",
        "availabilityStatus": 1,
        "privileges": null
    }, {
    "id": "**59b18e99-7516-4c9a-8e1a-9d28f4705123**",
    "name": "Name",
    "appId": "",
    "publishTime": "2020-05-17",
    "published": true,
    "stream": {
        "id": "abec8d41-5201-43ab809f-3063750deeee",
        "name": "name",
        "privileges": null
    },
    "savedInProductVersion": "12.0",
    "migrationHash": "qewjhjkw-djqwhndj",
    "availabilityStatus": 1,
    "privileges": null
}

    ]'''

我想要这个 49b18e99-7516-4c9a-8e1a-9d28f470512 和 59b18e99-7516-4c9a-8e1a-9d28f4705123 ,但使用“sed -n 's|.*"id":"\([^"]*\)".*||p'” 我正进入(状态 49b18e99-7516-4c9a-8e1a-9d28f470512, aaec8d41-5201-43ab809f-3063750dffff, 59b18e99-7516-4c9a-8e1a-9d28f4705123, abec8d41-5201-43ab809f-3063750deeee 如果文件有多个 json 对象,如上所示。 那么请帮我找到上面只使用sed的最佳命令。

使用任何 POSIX awk:

awk '
    /{ *$/ { depth++ }
    /^ *}/ { depth-- }
    (depth == 1) && sub(/^[[:space:]]*"id": *"/,"") && sub(/", *$/,"")
' file
**49b18e99-7516-4c9a-8e1a-9d28f470512**
**59b18e99-7516-4c9a-8e1a-9d28f4705123**

使用 GNU awk 和您显示的示例,请尝试以下 awk 代码。用 GNU awk 编写和测试。简单的解释是,将 RS 设置为“id”:[直到第 1 次出现 }。然后使用 match 函数通过使用正则表达式 "id":[[:space:]]+"[^"]* 来匹配 OP 所需的精确值,然后打印值。

awk -v RS='"id":[^}]*' '
match(RT,/"id":[[:space:]]+"[^"]*/){
  val=substr(RT,RSTART,RLENGTH)
  sub(/.*"/,"",val)
  print val
}
' Input_file