Jeśli naprawdę nie można użyć właściwego parsera JSON takie jak jq
[1] , spróbuj awk
opartych rozwiązanie:
Bash 4.x:
readarray -t values < <(awk -F\" 'NF>=3 {print $4}' myfile.json)
Bash 3 .x:
IFS=$'\n' read -d '' -ra values < <(awk -F\" 'NF>=3 {print $4}' myfile.json)
w tym sklepie wszystkie właściwości wartości w tablicy Bash ${values[@]}
, które można sprawdzić za pomocą
declare -p values
.
Te rozwiązania mają ograniczenia:
- każda nieruchomość musi być w oddzielnym wierszu,
- wszystkie wartości muszą być podwójnie cytowany
- osadzonych uciekły cudzysłowy nie są obsługiwane.
Wszystkie te ograniczenia potwierdzają zalecenie używania odpowiedniego parsera JSON.
Uwaga: Poniższe rozwiązania alternatywne użyć 4.x + readarray -t values
polecenia bash, ale również pracować z alternatywą Bash 3.x IFS=$'\n' read -d '' -ra values
.
grep
+ cut
kombinacja: pojedyncza komenda grep
nie zrobi (chyba, że używasz GNUgrep
- patrz poniżej), ale dodanie cut
pomaga:
readarray -t values < <(grep '"' myfile.json | cut -d '"' -f4)
GNUgrep
: Używanie -P
do obsługi PCRE, które wspiera t \K
rzucić wszystko dopasowane do tej pory (a bardziej elastyczną alternatywę dla twierdzenia przeglądowej tyłu), jak również twierdzenia antycypowana ((?=...)
):
readarray -t values < <(grep -Po ':\s*"\K.+(?="\s*,?\s*$)' myfile.json)
Wreszcie, oto czysty atakujących (3 .x +), roztwór:
co czyni przydatnym ten sposób alternatywę względem wyników jest to, że żadne z zewnętrznych narzędzi nazywane są w każdej iteracji; jednak w przypadku większych plików wejściowych rozwiązanie oparte na zewnętrznych narzędziach będzie znacznie szybsze.
#!/usr/bin/env bash
declare -a values # declare the array
# Read each line and use regex parsing (with Bash's `=~` operator)
# to extract the value.
while read -r line; do
# Extract the value from between the double quotes
# and add it to the array.
[[ $line =~ :[[:blank:]]+\"(.*)\" ]] && values+=("${BASH_REMATCH[1]}")
done < myfile.json
declare -p values # print the array
[1] Oto co solidna jq
-na rozwiązanie będzie wyglądać (Bash 4.x):
readarray -t values < <(jq -r '.[]' myfile.json)
Wykorzystanie 'jq' do tego. – sjsam
Zajrzyj do pytania [\ [to \]] (http://unix.stackexchange.com/questions/177843/parse-one-field-from-an-json-array-into-bash-array) nam trochę wysiłku z twojej strony, aby rozwiązać ten problem. – sjsam
Ten 'cat myfile.json | grep nazwa | cut -d ':' -f2' może pomóc. –