Mam wyjście JSON, które zawiera listę obiektów przechowywanych w zmiennej. (Nie mogę frazować tego prawa)
[
{
"item1": "value1",
"item2": "value2",
"sub items": [
{
"subitem": "subvalue"
}
]
},
{
"item1": "value1_2",
"item2": "value2_2",
"sub items_2": [
{
"subitem_2": "subvalue_2"
}
]
}
]
Potrzebuję wszystkich wartości dla item2 w tablicy, aby skrypt bash mógł być uruchomiony na Ubuntu 14.04.1.
Znalazłem wiele sposobów na umieszczenie całego wyniku w tablicy, ale nie tylko potrzebnych mi przedmiotów
jq . <<< "$json"
jest związany z powłoką (bash), niespecyficzny dlajq
arr=( $(...) )
jq
komenda, ale proszę nie analizować danych wyjściowych komendy w tablicy zarr=( $(...) )
(chociaż zdarza się, że działa z przykładowymi danymi wejściowymi): nie działa zgodnie z przeznaczeniem z osadzonymi lub wiodącymi / końcowymi białymi spacjami i może spowodować przypadkowe globbing.Następujące błędy są w rzeczywistości:
Zamiast tego użyj:
... lub jeszcze lepiej ...
źródło
Dzięki sputnick doszedłem do tego:
JSON, który mam, jest wyjściem z API. Wszystko, co musiałem zrobić, to usunąć argument pliku i przesłać
|
wyjście curl do jq. Działa świetnie i zapisał kilka kroków.źródło
*
- zostanie on zastąpiony listą plików w bieżącym katalogu.item2
wartość z białymi znakami stałaby się więcej niż jednym elementem tablicy.jako łatwą alternatywę, spójrz na
jtc
narzędzie (na https://github.com/ldn-softdev/jtc ), aby osiągnąć to samo (jak w przykładzie jq):wyjaśnienie
-w
opcji: nawiasy kątowe<...>
określają wyszukiwanie całego JSON, sufiksl
nakazuje wyszukiwanie etykiet zamiast wartości,+0
instruuje, aby znaleźć wszystkie wystąpienia (zamiast tylko pierwszego).źródło
arr=( $(jq ...) )
odpowiedzi, o ile treść jest dzielona na ciągi znaków i rozwijana globalnie, aby zapełnić tablicę - co oznacza, że spacje (nie tylko nowe linie) tworzą nowe elementy, a elementy, które wyglądają jak wyrażenie globalne, są zastępowane plikami, które dopasowania do wyrażenia.