如何在 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
'''[ {
"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