2014-11-13 3 views
2

Я в настоящее время как-то разрознен, потому что я смутил, как разбирать JSON в bash.Разбор двумерных массивов JSON в bash

я основной запрос завитка к успокоительной API в сценарии Баш и получить массив JSON в качестве ответа, который ищет, как это с несколькими записями:

[{"id":"012.mp4","language":"en","timestamp":1407517051,"name":"012.mp4"},{"id":"013.mp4","language":"en","timestamp":1407512051,"name":"013.mp4"}]

Теперь я должен разобрать этот JSON в моем сценарии Bash. Моя цель состоит в том, чтобы перебрать все записи и (w) получить ressource, указанный с именем. Таким образом, в этом примере выше, я хотел бы

wget 012.mp4

wget 013.mp4

Я был бы признателен любых советов фрагментов, как архив, который. Я даже не знаю, как это сделать, я кое-что прочитал об использовании python, но я понятия не имею о python.

+4

Причина, по которой с помощью Python (или рубин или любой другой язык сценариев с пакетами на то пошло) хорошая идея состоит в том, что у них есть пакеты, которые обеспечивают JSON синтаксический анализ и дать вам структуры данных более высокого уровня для работы. Я настоятельно рекомендую вам использовать другой язык, чем bash, чтобы сделать это, усилия, вероятно, будут меньше в конце, чем выяснение того, как сделать это правильно с bash. –

+2

Это не похоже на двумерный массив для меня вообще - это одномерный массив с объектами (словари/хэши) внутри. –

+0

Вот библиотека для этого: https://github.com/dominictarr/JSON.sh - должно позволить вам начать с вашей цели. – JimiDini

ответ

4

Инструмент jq обеспечивает легкий в использовании JSON парсер для Баш:

while read -r name; do 
    wget "$name" 
done < <(curl http://your.url/ | jq -r .[].name) 

Вы можете проверить это прямо:

jq -r .[].name <<<'[{"name": "hello"}, {"name": "world"}]' 

возвращается:

hello 
world 
+0

, что на самом деле не выглядит наполовину плохим! – njzk2

0

Если вы не хотите полномасштабную JSon синтаксический, для такого простого файла, который вы также можете взломать что-то быстро и грязно, как:

sed -En -e 's/}/\n/' -e 's/.*name":"(.*mp4)".*/\1/p' < file.json 

Кроме того, вы можете попробовать json_reformat команду, а затем перейти на СЭД для извлечения значения.

0

Pure BASH --- просто для удовольствия:

#!/bin/bash 

string='[{"id":"012.mp4","language":"en","timestamp":1407517051,"name":"012.mp4"},{"id":"013.mp4","language":"en","timestamp":1407512051,"name":"013.mp4"}]' 

string2="${string//\},\{/ }" 
oldifs="$IFS"; IFS=' ' 
array=($string2) 
IFS="$oldifs" 

for i in "${array[@]}"; do 
after_last_colon="${i##*:}" 
echo "wget ${after_last_colon//[\}\]]/}" 
done <<< "$array" 

Результат:

wget "012.mp4" 
wget "013.mp4" 
Смежные вопросы