No puedo usar ninguna de las respuestas aquí. Sin jq disponible, sin matrices de shell, sin declaración, sin grep -P, sin mirar atrás y sin mirar atrás, sin Python, sin Perl, sin Ruby, no, ni siquiera Bash ... Las respuestas restantes simplemente no funcionan bien. JavaScript sonaba familiar, pero la lata dice Nescaffe, por lo que es un no ir también :) Incluso si estuviera disponible, para mi simple necesidad, serían excesivos y lentos.
Sin embargo, es extremadamente importante para mí obtener muchas variables de la respuesta con formato json de mi módem. ¡Lo estoy haciendo en un sh con BusyBox muy recortado en mis enrutadores! No hay problemas con el uso de awk solo: solo configure delimitadores y lea los datos. ¡Para una sola variable, eso es todo!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
¿Recuerdas que no tengo matrices? Tuve que asignar dentro de los datos analizados awk a las 11 variables que necesito en un script de shell. Dondequiera que mirara, se decía que era una misión imposible. No hay problema con eso también.
Mi solución es simple. Este código: 1) analizará el archivo .json de la pregunta (en realidad, tomé prestada una muestra de datos de trabajo de la respuesta más votada) y elegirá los datos citados, más 2) creará variables de shell desde el awk asignando un shell con nombre libre nombres de variables
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"
No hay problemas con espacios en blanco. En mi uso, el mismo comando analiza una salida larga de una sola línea. A medida que se utiliza eval, esta solución es adecuada solo para datos confiables. Es sencillo adaptarlo para recoger datos no citados. Para una gran cantidad de variables, la ganancia de velocidad marginal se puede lograr usando else if. La falta de matriz obviamente significa: no hay registros múltiples sin violín adicional. Pero donde hay arreglos disponibles, adaptar esta solución es una tarea simple.
La respuesta de @maikel sed casi funciona (pero no puedo comentarla). Para mis datos bien formateados, funciona. No tanto con el ejemplo utilizado aquí (las comillas faltantes lo descartan). Es complicado y difícil de modificar. Además, no me gusta tener que hacer 11 llamadas para extraer 11 variables. ¿Por qué? Calculé 100 bucles extrayendo 9 variables: ¡la función sed tardó 48,99 segundos y mi solución tardó 0,91 segundos! ¿No es justo? Haciendo una sola extracción de 9 variables: 0.51 vs. 0.02 seg.