2015-06-30 2 views
1

Я пытаюсь написать сценарий для ввода в заблуждение встроенных устройств, они извлекают объект 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"] 
+2

Использовать обычные JSon анализатору – 123

+1

попробовать JQ: http://stedolan.github.io/jq/ – Will

+0

Почему СЭД? Если вы используете новую систему с 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

ответ

0

С jq вы можете выполнить следующую команду:

jq -r '.scripts[]' the.json 

Если вы хотите, чтобы поместить это в массив , использовать замену команды:

arr=($(jq -r '.scripts[]' a.json)) 

Теперь вы можете получить доступ к отдельным ССЫЛОК:

echo "${arr[0]}" 
echo "${arr[1]}" 
echo "${arr[2]}" 
Смежные вопросы