【发布时间】:2015-09-17 03:19:47
【问题描述】:
我正在尝试编写用于调试嵌入式设备的脚本,它们从 API 中检索 JSON 对象,该 API 包含必须运行以调试设备的脚本数组。
{
"status":"wait",
"settings":{
"serialNo": "123456",
"macAddress":"ff:ff:ff:ff:ff:ff",
"ipMode": "static|dhcp",
"ipAddress": "192.168.0.1",
"ipSubnet": "255.255.255.0",
"ipGateway": "192.168.0.10",
"ipDns": "192.168.0.10"
},
"scripts":[
"https://www.google.co.uk/1",
"https://www.google.co.uk/2",
"https://www.google.co.uk/3"
]
}
由于设备使用busybox 运行最小的linux 安装,我使用sed 来“解析”JSON 并从对象中检索值。这适用于单个参数,例如
mac=$(echo $reply | sed -ne 's/^.*"macAddress":"\([^"]*\)".*$/\1/p')
echo $mac
ff:ff:ff:ff:ff:ff
我尝试使用类似的正则表达式来匹配 [ 和 ] 之间的数组内容,但是当我通过 sed 运行它时,它什么也没有返回。
scripts=$(echo $reply | sed -ne 's/"scripts":\(\[[^\[\]]*\]\)/\1/p')
echo $scripts
我希望它的结果是这样的:
echo $scripts
["https://www.google.co.uk/1","https://www.google.co.uk/2","https://www.google.co.uk/3"]
【问题讨论】:
-
为什么选择 sed?如果您在使用 Perl 版本 >= 5.14 的新系统上,那么您可以使用 JSON::PP 进行解析。示例代码可以在这里找到:dispersiondesign.com/articles/perl/json_data