Tôi không thể sử dụng bất kỳ câu trả lời ở đây. Không có jq, không có mảng shell, không khai báo, không grep -P, không lookbehind và lookahead, không Python, không Perl, không Ruby, không - thậm chí cả Bash ... Các câu trả lời còn lại đơn giản là không hoạt động tốt. JavaScript nghe có vẻ quen thuộc, nhưng tin nói Nescaffe - vì vậy nó cũng không nên đi :) Ngay cả khi có sẵn, vì nhu cầu đơn giản của tôi - chúng sẽ quá mức và chậm.
Tuy nhiên, điều cực kỳ quan trọng đối với tôi là nhận được nhiều biến từ trả lời được định dạng json của modem. Tôi đang làm điều đó trong một sh với BusyBox được cắt giảm rất nhiều tại các bộ định tuyến của tôi! Không có vấn đề khi sử dụng awk một mình: chỉ cần đặt dấu phân cách và đọc dữ liệu. Đối với một biến duy nhất, đó là tất cả!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
Hãy nhớ rằng tôi không có mảng? Tôi đã phải gán trong dữ liệu được phân tích cú pháp awk cho 11 biến mà tôi cần trong tập lệnh shell. Bất cứ nơi nào tôi nhìn, đó được cho là một nhiệm vụ bất khả thi. Không có vấn đề với điều đó, quá.
Giải pháp của tôi rất đơn giản. Mã này sẽ: 1) phân tích tệp .json từ câu hỏi (thực ra, tôi đã mượn một mẫu dữ liệu làm việc từ câu trả lời được nâng cao nhất) và chọn ra dữ liệu được trích dẫn, cộng với 2) tạo các biến shell từ trong awk gán shell có tên miễn phí tên biến.
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"
Không có vấn đề với khoảng trống trong. Trong sử dụng của tôi, cùng một lệnh phân tích một đầu ra dòng đơn dài. Khi eval được sử dụng, giải pháp này chỉ phù hợp với dữ liệu đáng tin cậy. Thật đơn giản để điều chỉnh nó để lấy dữ liệu không được trích dẫn. Đối với số lượng lớn các biến, tốc độ tăng biên có thể đạt được bằng cách sử dụng khác nếu. Thiếu mảng rõ ràng có nghĩa là: không có nhiều bản ghi mà không cần thêm. Nhưng nơi có sẵn các mảng, việc điều chỉnh giải pháp này là một nhiệm vụ đơn giản.
@maikel sed trả lời gần như hoạt động (nhưng tôi không thể nhận xét về nó). Đối với dữ liệu được định dạng độc đáo của tôi - nó hoạt động. Không quá nhiều với ví dụ được sử dụng ở đây (thiếu dấu ngoặc kép ném nó đi). Nó là phức tạp và khó sửa đổi. Thêm vào đó, tôi không thích phải thực hiện 11 cuộc gọi để trích xuất 11 biến. Tại sao? Tôi đã tính thời gian 100 vòng lặp trích xuất 9 biến: hàm sed mất 48,99 giây và giải pháp của tôi mất 0,91 giây! Không đẹp? Chỉ thực hiện một trích xuất duy nhất gồm 9 biến: 0,51 so với 0,02 giây.