因为它是 JSON,所以应该使用 JSON 感知工具来处理它。例如,如果您更喜欢 awk,则方法是使用 GNU awk 的 JSON 扩展。这是一个小方法。
首先下载并编译适当版本的 GNU awk、Gawkextlib 和 gawk-json。这很简单,实际上,只是./configure 和make。然后,写一些代码:
awk '
@load "json" # enable json extension
{
lines=lines $0 # read json file records and buffer to var lines
if(json_fromJSON(lines,data)==1) { # once the json is complete
for(i in data["info"]["version"]) # that seems to be an array so all elements
print data["info"]["version"][i] # are outputed
lines="" # once done with the first json object
} # reset the var for more lines
}' file
本次输出:
2034.2
解释一下:
JSON 文件结构可以从一行到多行不等,例如:
{"version":"4.9.123M","info":{"version":[2034.2],"description":""},"status":"OK"}
或:
{
"version": "4.9.123M",
"info": {
"version": [
2034.2
],
"description": ""
},
"status": "OK"
}
所以我们需要用lines=lines $0 缓冲JSON 行,直到变量lines 中有一个完整的有效对象。我们使用扩展函数json_fromJSON() 来确定@987654332@ 中的有效性。验证后,对象被解开并存储到数组data。对于这个特定对象,数组的结构是:
data["version"]="4.9.123M"
data["info"]["version"][1]="2034.2"
data["info"]["description"]=""
data["status"]="OK"
我们可以使用这个递归数组扫描函数检查对象并产生一些输出:
awk '
@load "json"
function scan(a,p, q) { # a is array, p path to it, q is qnd *
if(isarray(a))
for(i in a) {
q=p (p==""?"":"->") i
scan(a[i],q)
}
else
print p ":" a
}
{
lines=lines $0
if(json_fromJSON(lines,data)==1)
scan(data) #
}' file.json
输出:
status:OK
version:4.9.123M
info->version->1:2034.2
info->description:
*) 又快又脏
以下是如何从数组中输出 JSON 的简短示例:https://stackoverflow.com/a/58109715/4162356