Я пытаюсь написать сценарий для ввода в заблуждение встроенных устройств, они извлекают объект JSON из API, который содержит массив скриптов, которые должны запускаться для активации устройства.Извлечь массив из JSON с помощью sed и regex
{
"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"
]
}
Поскольку устройства работают под управлением минимальной Linux устанавливается с BusyBox Я использую СЭД для «разбора» в JSON и извлекать значения из объекта. Это прекрасно работает для отдельных параметров, таких как
mac=$(echo $reply | sed -ne 's/^.*"macAddress":"\([^"]*\)".*$/\1/p')
echo $mac
ff:ff:ff:ff:ff:ff
Я стараюсь использовать подобное регулярное выражение соответствует содержимому массива между [
и ]
, но когда я запускаю его через СЭД возвращается ни с чем.
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"]
Использовать обычные JSon анализатору – 123
попробовать JQ: http://stedolan.github.io/jq/ – Will
Почему СЭД? Если вы используете новую систему с Perl из версии> = 5.14, вы можете использовать [JSON :: PP] (http://search.cpan.org/~makamaka/JSON-PP-2.27300/lib/JSON/ PP.pm) для разбора. Пример кода можно найти здесь: http://www.dispersiondesign.com/articles/perl/json_data – nhahtdh