Saya tidak dapat menggunakan jawaban apa pun di sini. Tidak ada jq yang tersedia, tidak ada susunan shell, tidak ada yang menyatakan, tidak ada grep -P, tidak ada tampilan di belakang dan lookahead, tidak ada Python, tidak Perl, tidak ada Ruby, tidak - bahkan tidak Bash ... Jawaban yang tersisa tidak bekerja dengan baik. JavaScript kedengarannya familier, tetapi kaleng itu mengatakan Nescaffe - jadi itu tidak boleh, :) Bahkan jika tersedia, untuk kebutuhan sederhana saya - mereka akan berlebihan dan lambat.
Namun, sangat penting bagi saya untuk mendapatkan banyak variabel dari json diformat dari modem saya. Saya melakukannya di sh dengan BusyBox sangat dipangkas di router saya! Tidak ada masalah menggunakan awk saja: cukup setel pembatas dan baca datanya. Untuk satu variabel, itu saja!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
Ingat saya tidak punya array? Saya harus menetapkan dalam parsing awk data ke 11 variabel yang saya butuhkan dalam skrip shell. Ke mana pun saya melihat, itu dikatakan sebagai misi yang mustahil. Tidak masalah dengan itu juga.
Solusi saya sederhana. Kode ini akan: 1) mem-parsing file .json dari pertanyaan (sebenarnya, saya telah meminjam sampel data yang berfungsi dari jawaban yang paling banyak dipilih) dan memilih data yang dikutip, ditambah 2) membuat variabel shell dari dalam awk yang menugaskan shell bernama gratis nama variabel.
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"
Tidak ada masalah dengan kekosongan di dalam. Dalam penggunaan saya, perintah yang sama mem-parsing output baris tunggal yang panjang. Karena eval digunakan, solusi ini hanya cocok untuk data tepercaya. Sangat mudah untuk menyesuaikannya dengan pengambilan data yang tidak dikutip. Untuk sejumlah besar variabel, gain kecepatan marginal dapat dicapai dengan menggunakan else if. Kurangnya array jelas berarti: tidak ada banyak catatan tanpa mengutak-atik ekstra. Tetapi di mana array tersedia, mengadaptasi solusi ini adalah tugas yang sederhana.
@maikel sed jawaban hampir berfungsi (tapi saya tidak bisa mengomentarinya). Untuk data yang diformat dengan baik - berfungsi. Tidak terlalu banyak dengan contoh yang digunakan di sini (kutipan yang hilang membuangnya). Ini rumit dan sulit untuk dimodifikasi. Plus, saya tidak suka harus membuat 11 panggilan untuk mengekstrak 11 variabel. Mengapa? Saya menghitung 100 loop mengekstraksi 9 variabel: fungsi sed mengambil 48,99 detik dan solusi saya mengambil 0,91 detik! Tidak adil? Melakukan hanya satu ekstraksi 9 variabel: 0,51 vs 0,02 detik.