Я не можу використати тут жодної відповіді. Немає доступних jq, немає масивів оболонок, немає оголошення, немає grep -P, немає перспектив і lookahead, ні Python, ні Perl, ні Ruby, ні - навіть Bash ... Залишилися відповіді просто не працюють добре. JavaScript прозвучав знайомо, але олово каже Nescaffe - так що це теж не йде :) Навіть якщо вони будуть доступні, для моєї простої потреби - вони будуть надмірними і повільними.
Тим не менше, для мене надзвичайно важливо отримати багато змінних з форматованої відповіді json мого модему. Я роблю це в ш, з дуже підстриженим BusyBox на моїх маршрутизаторах! Немає проблем із використанням однієї програми awk: просто встановіть роздільники та прочитайте дані. Для однієї змінної це все!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
Пам'ятаєте, у мене немає масивів? Мені довелося призначити в межах awk проаналізовані дані 11 змінним, які мені потрібні в сценарії оболонки. Куди б я не глянув, це говорилося про неможливу місію. З цим теж немає проблем.
Моє рішення просте. Цей код: 1) розбере .json-файл із запитання (фактично я запозичив зразок робочих даних із найбільш актуалізованої відповіді) та виберу цитовані дані, плюс 2) створить змінні оболонки зсередини awk, призначивши вільну названу оболонку назви змінних.
eval $( curl -s 'https://api.github.com/users/lambda' |
awk ' BEGIN { FS="\""; RS="," };
{
if ($2 == "login") { print "Login=\""$4"\"" }
if ($2 == "name") { print "Name=\""$4"\"" }
if ($2 == "updated_at") { print "Updated=\""$4"\"" }
}' )
echo "$Login, $Name, $Updated"
Немає проблем із заготовками всередині. У моєму використанні та сама команда аналізує довгий вихід одного рядка. Оскільки використовується eval, це рішення підходить лише для надійних даних. Його легко адаптувати до підбору даних, котируються без котирування. Для величезної кількості змінних, граничний приріст швидкості можна досягти, використовуючи ще, якщо. Відсутність масиву, очевидно, означає: відсутність декількох записів без зайвих фейдів. Але там, де доступні масиви, адаптувати це рішення - це просте завдання.
@maikel sed відповідь майже працює (але я не можу коментувати це). Для моїх добре відформатованих даних - це працює. Не так багато з прикладу, який тут використовується (відсутні цитати викидають його). Це складно і важко модифікувати. Крім того, мені не подобається робити 11 дзвінків, щоб витягти 11 змінних. Чому? Я приуротив 100 циклів, витягуючи 9 змінних: функція sed займала 48,99 сек, а мій розчин займав 0,91 сек! Нечесно? Виконується лише один видобуток 9 змінних: 0,51 проти 0,02 сек.