2015-04-14 20 views
6

Próbuję utworzyć skrypt powłoki, który pobierze adres URL obrazu dla losowego komiksu XKCD, tak, że mogę go wyświetlić za pomocą Übersicht. Ponieważ można tylko zapytać API xkcd za ostatni komiks lub specyficzny komiks muszę:Parsowanie odpowiedzi json curl i użycie odpowiedzi w celu utworzenia kolejnego żądania

  1. Wyślij wniosek GET do http://xkcd.com/info.0.json, pobrać wartość elementu num.
  2. Wyślij kolejne żądanie do http://xkcd.com/XXX/info.0.json gdzie XXX to wartość num.

Moja obecna komenda wygląda tak skutecznie i zwraca liczbę komiks:

curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num": \d+' | grep -Eo '\d+' 
  1. I nie były w stanie dowiedzieć się, jak używać grup przechwytywania z grep, więc muszę grep json dwa razy. Powszechnie zaleca się używanie -P, która nie jest obsługiwana w systemie Mac OS X 10.10.
  2. Nie mam pojęcia, jak odczytać wynik polecenia grep (jako XXX) do drugiej komendy curl -s 'http://xkcd.com/XXX/info.0.json'.

Odpowiedz

7
  1. na OS X można wykorzystać systemowe Perl:

    curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*/\1/' 
    
  2. można zapisać dane wyjściowe do zmiennej z podstawienia polecenia:

    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" 
    

    lub bardziej zwięźle, dwa w jednym, aczkolwiek niezbyt czytelne:

    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" 
    

Przy okazji, bardzo polecam jq jak procesor wiersza komend JSON. Aby wyodrębnić num z jq, jest to tak proste, jak

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

i mimo, że nie o to poprosić, oto prosta-liner z jq że wydobywa URI najnowszym obrazie:

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

Przykładowa wydajność:

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

To działa świetnie w Terminalu, więc akceptuję to. Dzięki, świetna robota. Teraz wystarczy, że zadziała w Übersicht - otrzymuję błąd "ósemkowej sekwencji ucieczki". –

+0

@SamuelLindblom Nie widzę żadnej ósemkowej sekwencji poleceń w moich komendach. I nie używam Übersicht - czy możesz wyjaśnić, który krok idzie źle w szczegółach? (Jeśli nie masz pewności, możesz rozbić potok i przetestować osobno). – 4ae1e1