Если вы действительно не можете использовать правильный JSON парсер, такие как jq
[1] , попробуйте awk
-На решение:
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)
В этом магазине все имущество значения в массиве Баша ${values[@]}
, которое вы можете проверить с помощью
declare -p values
.
Эти решения имеют ограничения:
- каждое свойство должно быть по своей линии,
- все значения должны быть в двойных кавычках,
- внедренные сбежавшие двойные кавычки не поддерживаются.
Все эти ограничения подкрепляют рекомендацию использовать надлежащий парсер JSON.
Примечание: Следующие альтернативные решения используют Bash 4.x + readarray -t values
команду, но они также работают с альтернативой Bash 3.x, IFS=$'\n' read -d '' -ra values
.
grep
+ cut
сочетание: один grep
команда не будет делать (если вы не используете GNUgrep
- смотри ниже), но добавление cut
помогает:
readarray -t values < <(grep '"' myfile.json | cut -d '"' -f4)
GNUgrep
: Использование -P
для поддержки PCRE, которые su pport \K
бросить весь согласованные до сих пор (более гибкой альтернативу просмотрового за утверждение), а также прогнозные утверждения ((?=...)
):
readarray -t values < <(grep -Po ':\s*"\K.+(?="\s*,?\s*$)' myfile.json)
Наконец, вот чистого Bash (3 .x +) решение:
что делает это жизнеспособной альтернативой с точки зрения производительности является то, что никакие внешние утилиты не вызываются в каждой итерации цикла; однако для больших входных файлов решение на основе внешних утилит будет намного быстрее.
#!/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] Вот что надежное jq
основанное решение будет выглядеть (Bash 4.x):
readarray -t values < <(jq -r '.[]' myfile.json)
Используйте 'jq' для этого. – sjsam
Посмотрите на [\ [this \]] (http://unix.stackexchange.com/questions/177843/parse-one-field-from-an-json-array-into-bash-array) вопрос и шоу мы с вашей стороны решили немного решить эту проблему. – sjsam
Этот 'cat myfile.json | имя grep | cut -d ':' -f2' может помочь. –