2015-04-14 19 views
6

Sto provando a creare uno script di shell che recuperi l'URL immagine per un fumetto XKCD casuale, in modo che possa visualizzarlo utilizzando Übersicht. Dal momento che si può solo chiedere l'API XKCD per l'ultimo fumetto o una specifica fumetto ho bisogno di:Analisi di una risposta json di arricciatura e utilizzo della risposta per creare un'altra richiesta

  1. inviare una richiesta GET a http://xkcd.com/info.0.json, recuperare il valore dell'elemento num.
  2. Invia un'altra richiesta a http://xkcd.com/XXX/info.0.json dove XXX è il valore di num.

mio comando corrente assomiglia a questo e con successo restituisce il numero fumetto:

curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num": \d+' | grep -Eo '\d+' 
  1. non sono stato in grado di capire come utilizzare i gruppi di cattura con grep, quindi ho bisogno di grep il JSON due volte. Il consiglio comune è utilizzare -P, che non è supportato in Mac OS X 10.10.
  2. Non ho idea di come leggere l'output di grep (come XXX) nel secondo comando curl -s 'http://xkcd.com/XXX/info.0.json'.

risposta

7
  1. Su OS X è possibile utilizzare il sistema di Perl:

    curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*/\1/' 
    
  2. È possibile salvare l'output in una variabile con la sostituzione di comando:

    num=$(curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*/\1/') 
    curl -sS "http://xkcd.com/${num}/info.0.json" 
    

    o più conciso, due in uno, anche se non molto leggibile:

    curl -sS "http://xkcd.com/$(curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*/\1/')/info.0.json" 
    

proposito, consiglio vivamente jq come il processore riga comandi JSON. Per estrarre num con jq, è semplice come

curl -sS http://xkcd.com/info.0.json | jq '.num' 

e anche se non ha chiesto per esso, ecco un semplice one-liner con jq che estrae l'URI l'ultima immagine:

curl -sS "http://xkcd.com/$(curl -sS http://xkcd.com/info.0.json | jq '.num')/info.0.json" | jq -r '.img' 

Esempio di output:

http://imgs.xkcd.com/comics/spice_girl.png 
+0

Questo funziona perfettamente nel terminale, quindi lo accetto. Grazie, ottimo lavoro. Ora ho solo bisogno di farlo funzionare in Übersicht - sto ottenendo un errore di 'octal escape sequence'. –

+0

@SamuelLindblom Non riesco a vedere nessuna sequenza di escape ottale nei miei comandi. E non uso Übersicht: puoi spiegare quale passaggio va storto in dettaglio? (Se non sei sicuro, puoi abbattere la pipeline e testare separatamente). – 4ae1e1

Problemi correlati