Não posso usar nenhuma das respostas aqui. Sem jq disponível, sem matrizes de shell, sem declarar, sem grep -P, sem lookbehind e lookahead, sem Python, sem Perl, sem Ruby, não - nem mesmo Bash ... As respostas restantes simplesmente não funcionam bem. O JavaScript parecia familiar, mas a lata diz Nescaffe - então também não é possível :) Mesmo se disponíveis, para minha simples necessidade - eles seriam um exagero e lentos.
No entanto, é extremamente importante para mim obter muitas variáveis da resposta formatada em json do meu modem. Estou fazendo isso em um sh com o BusyBox muito aparado nos meus roteadores! Não há problemas ao usar o awk sozinho: basta definir delimitadores e ler os dados. Para uma única variável, isso é tudo!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
Lembra que não tenho matrizes? Eu tive que atribuir dentro dos dados analisados do awk às 11 variáveis necessárias em um script de shell. Onde quer que eu olhasse, isso era uma missão impossível. Não tem problema com isso também.
Minha solução é simples. Este código irá: 1) analisar o arquivo .json da pergunta (na verdade, peguei emprestada uma amostra de dados de trabalho da resposta mais votada) e seleciono os dados citados, além de 2) criar variáveis de shell a partir do awk, designando shell nomeado gratuito nomes de variáveis.
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"
Sem problemas com espaços em branco no interior. No meu uso, o mesmo comando analisa uma saída longa de linha única. Como o eval é usado, esta solução é adequada apenas para dados confiáveis. É simples adaptá-lo para coletar dados não citados. Para um grande número de variáveis, o ganho marginal de velocidade pode ser alcançado usando else if. A falta de matriz obviamente significa: não há vários registros sem mexer extra. Mas onde as matrizes estão disponíveis, adaptar esta solução é uma tarefa simples.
@maikel sed resposta quase funciona (mas não posso comentar). Para meus dados bem formatados - funciona. Não muito com o exemplo usado aqui (aspas ausentes o impedem). É complicado e difícil de modificar. Além disso, não gosto de fazer 11 chamadas para extrair 11 variáveis. Por quê? Cronometrei 100 loops para extrair 9 variáveis: a função sed levou 48,99 segundos e minha solução levou 0,91 segundos! Não é justo? Fazendo apenas uma extração única de 9 variáveis: 0,51 vs. 0,02 seg.