2016-12-28 2 views
0

В Bash У меня есть переменная, которая содержит объект JSON как строку, например:Извлечение подстроки между 2 подстрок

{"results":[{"Name":"blah-1","Version":"1.0"},{"Name":"Some Other Name","Version":"2b-alpha"}]}

Я получил от этого вызова curl.

Я хочу пойти получить версию строки в массив Баш, так что, когда я называю printf '%s\n' "${versions[@]}" печатает каждую строку версии построчно:

1.0 
2b-alpha 

Там может быть произвольное количество вхождений этих строк Version в JSON. Как бы это сделать, можно ли это сделать с чистым bash или мне нужно grep или sed и как будет выглядеть команда?

+1

Если вы хотите разобрать json, используйте парсер json. Если вы подумаете об этом достаточно долго, вы поймете, что это логично и имеет смысл. –

+0

Используйте 'jq' для разбора' json' – Inian

ответ

2

Как gniourf-gniourf предполагает, использование подходящий парсер JSON, например, jq для синтаксического анализа, для лучшей ремонтопригодности. Есть ли что-то вроде

$ echo "$jsonString" | jq -r '.results[] | "\(.Version)"' 

, который должен печатать содержимое как

1.0 
2b-alpha 

Идея является jq фильтр .results[] | "\(.Version)" выбирает все узлы под результат и извлекает все имена Version под ним.

Чтобы сохранить его в использовании массива process-substitution, как,

read -r -a jsonArray < <(echo "$jsonString" | jq -r '.results[] | "\(.Version)"') 

и распечатать содержимое массива в виде

printf '%s\n' "${jsonArray[@]}" 

См GitHub-jq-documentation странице инструкции по загрузке.

+1

Вы можете использовать '.results []. Version' – hek2mgl

-1

Один из способов:

arr=($(echo "$x" | grep -oP '(?<="Version":")[^"]+')) 

где x является переменной, в которой хранится ваша строка.

o - извлечь только часть строки P - использовать Perl-как регулярное выражение, мы используем положительный номер вид сзади

Вы можете обращаться к нему как:

printf '%s\n' "${arr[@]}" 
1

Если вам просто нужны номера версий, вам не нужно сохранять результат из curl в переменной. Вы можете напрямую вывести результаты из curl в jq:

versions=($(curl 'http://server/path' | jq -r '.results[].Version')) 
Смежные вопросы