Сохранение json:
{
"Names": [
{ "Name": "A", "Age": "1" },
{ "Name": "B", "Age": "2" },
{ "Name": "C", "Age": "3" }
]
}
как /tmp/input.txt Я могу запустить:
</tmp/input.txt jq --raw-output 'foreach .Names[] as $name ([];[];$name | .Name, .Age )' \
| while read -r name && read -r age; do
printf "My name is %s, I'm %d years old.\n" "$name" "$age";
printf -- "--\n";
done
--raw-output
с | .Name, .Age
просто печатает две строки в.Член массива имен, один с именем, а другой с возрастом.Затем я читаю две строки за раз с while read && read
и использую их для их циклического просмотра.
Если вы предпочитаете:
["A","1"]
["B","2"]
["C","3"]
, то это печально, лучше всего написатьполный синтаксический анализатор, который будет учитывать строки типа "\""
.В любом случае, вы можете:
</tmp/input2.txt sed 's/^\[//;s/\]$//;' \
| while IFS=, read name age; do
name=${name%\"};
name=${name#\"};
age=${age%\"};
age=${age#\"};
printf "My name is %s, I'm %d years old.\n" "$name" "$age";
printf -- "--\n";
done
Первый сед убрал начальные и включающие [
и ]
в каждой строке.Затем я читаю две строки, разделенные ,
(поэтому переменные типа "a,b","c,d"
будут прочитаны неправильно).Затем эти две струны лишаются ведущей и заключающей "
.Затем для вывода результата используется обычный printf.