मैं यहां किसी भी उत्तर का उपयोग नहीं कर सकता। कोई उपलब्ध jq, कोई शेल सरणियां, कोई घोषणा नहीं, कोई grep -P, कोई लुकअप और लुकहेड, कोई पायथन, कोई पर्ल, कोई रूबी, नहीं - नहीं भी बैश ... शेष उत्तर बस अच्छी तरह से काम नहीं करते हैं। जावास्क्रिप्ट परिचित लग रहा था, लेकिन टिन Nescaffe कहते हैं - तो यह एक नहीं जाना है, भी :) अगर मेरी सरल जरूरत के लिए भी उपलब्ध है - वे overkill और धीमी गति से होगा।
फिर भी, मेरे लिए अपने मॉडेम के जसन स्वरूपित उत्तर से कई चर प्राप्त करना बेहद महत्वपूर्ण है। मैं इसे एक तरह से अपने रूटर्स में बिजीबॉक्स के साथ नीचे छंटनी कर रहा हूं! अकेले awk का उपयोग करने में कोई समस्या नहीं: बस सीमांकक सेट करें और डेटा पढ़ें। एक एकल चर के लिए, यह सब है!
awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json
याद रखें मेरे पास कोई सरणियाँ नहीं हैं? मुझे 11 चर के लिए अजीब पार्स किए गए डेटा के भीतर असाइन करना था जो मुझे शेल स्क्रिप्ट में चाहिए। मैंने जहां भी देखा, कहा जाता है कि यह एक असंभव मिशन था। इसके साथ कोई समस्या नहीं है।
मेरा समाधान सरल है। यह कोड होगा: 1) प्रश्न से पार्स .json फ़ाइल (वास्तव में, मैंने सबसे ऊपर के उत्तर से एक कार्यशील डेटा नमूना उधार लिया है) और उद्धृत डेटा बाहर निकालता हूं, 2) awk असाइन किए गए मुक्त नामित शेल के भीतर से शेल चर बनाते हैं चर नाम।
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"
भीतर कोई समस्या नहीं है। मेरे उपयोग में, एक ही कमांड एक लंबी सिंगल लाइन आउटपुट को पार्स करता है। जैसा कि eval का उपयोग किया जाता है, यह समाधान केवल विश्वसनीय डेटा के लिए अनुकूल है। अयोग्य डेटा को पिक करने के लिए इसे अनुकूलित करना सरल है। बड़ी संख्या में वैरिएबल के लिए, सीमांत गति का लाभ प्राप्त किया जा सकता है यदि अन्य। सरणी का अभाव स्पष्ट रूप से इसका मतलब है: बिना किसी अतिरिक्त हलचल के कई रिकॉर्ड। लेकिन जहां सरणियाँ उपलब्ध हैं, इस समाधान को अपनाना एक सरल कार्य है।
@maikel sed उत्तर लगभग काम करता है (लेकिन मैं इस पर टिप्पणी नहीं कर सकता)। मेरे अच्छे स्वरूपित डेटा के लिए - यह काम करता है। यहां इस्तेमाल किए गए उदाहरण के साथ इतना नहीं है (लापता उद्धरण इसे फेंक देते हैं)। यह संशोधित करने के लिए जटिल और कठिन है। साथ ही, मुझे 11 चर निकालने के लिए 11 कॉल करना पसंद नहीं है। क्यों? मैंने 9 चर निकालने वाले 100 लूप निकाले: सेड फंक्शन ने 48.99 सेकेंड का समय लिया और मेरे सॉल्यूशन ने 0.91 सेकेंड लिया! निष्पक्ष नहीं? 9 चर: 0.51 बनाम 0.02 सेकंड का एक ही निष्कर्षण करना।