2015-04-14 14 views
6

Tôi đang cố gắng tạo tập lệnh shell sẽ tìm nạp url hình ảnh cho một truyện tranh XKCD ngẫu nhiên, để tôi có thể hiển thị nó bằng cách sử dụng Übersicht. Vì bạn chỉ có thể yêu cầu API XKCD cho truyện tranh mới nhất hoặc một truyện tranh cụ thể tôi cần phải:Phân tích cú pháp câu trả lời json curl và sử dụng phản hồi để xây dựng một yêu cầu khác

  1. Gửi yêu cầu GET để http://xkcd.com/info.0.json, lấy giá trị của phần tử num.
  2. Gửi yêu cầu khác đến http://xkcd.com/XXX/info.0.json trong đó XXX là giá trị của num.

lệnh hiện tại của tôi trông như thế này và thành công trả về số truyện tranh:

curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num": \d+' | grep -Eo '\d+' 
  1. tôi đã không thể tìm ra cách để sử dụng các nhóm chụp với grep, vì vậy tôi cần phải grep json hai lần. Lời khuyên chung là sử dụng -P, không được hỗ trợ trong Mac OS X 10.10.
  2. Tôi không biết cách đọc đầu ra của grep (như XXX) vào lệnh thứ hai curl -s 'http://xkcd.com/XXX/info.0.json'.

Trả lời

7
  1. Trên OS X, bạn có thể sử dụng hệ thống Perl:

    curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*/\1/' 
    
  2. Bạn có thể lưu đầu ra cho một biến với thay lệnh:

    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" 
    

    hoặc ngắn gọn hơn, hai-trong-một, mặc dù không phải là rất dễ đọc:

    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" 
    

Bằng cách này, tôi khuyên bạn nên jq như bộ vi xử lý dòng lệnh JSON. Để trích xuất num với jq, nó đơn giản như

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

và mặc dù bạn không yêu cầu nó, đây là một đơn giản một-liner với jq để trích ra phần URI của hình ảnh mới nhất:

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

Ví dụ đầu ra:

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

Điều này làm việc tuyệt vời trong Thiết bị đầu cuối, vì vậy tôi chấp nhận nó. Cảm ơn, công việc tuyệt vời. Bây giờ tôi chỉ cần làm cho nó hoạt động trong Übersicht - tôi nhận được một chuỗi 'octal escape sequence'. –

+0

@SamuelLindblom Tôi không thể thấy bất kỳ chuỗi thoát bát phân nào trong các lệnh của tôi. Và tôi không sử dụng Übersicht - bạn có thể giải thích bước nào sai chi tiết không? (Nếu bạn không chắc chắn, bạn có thể chia nhỏ đường dẫn và thử nghiệm riêng.) – 4ae1e1

Các vấn đề liên quan