बिजीबॉक्स टूल के साथ पार्सिंग जेन्सन


-1

मेरे पास एक POSIX- संगत इंस्‍टॉल स्क्रिप्ट है जो किसी सॉफ़्टवेयर रजिस्ट्री से पुनर्प्राप्त किए गए json blob से जानकारी प्राप्त करके कुछ सॉफ़्टवेयर का नवीनतम संस्करण निर्धारित करता है:

meta=$(wget -qO - https://registry.npmjs.org/after-dark/latest)
grep --version | grep "BSD grep" 1>/dev/null && vers=$(echo "$meta" | grep -oE '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')
grep --version | grep "GNU grep" 1>/dev/null && vers=$(echo "$meta" | grep -oP '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')

मुझे इस सॉफ़्टवेयर को बिजीबॉक्स के साथ संगत बनाने की आवश्यकता है, जो बीएसडी grep की तरह, -Eविस्तारित रेगेक्स समर्थन के लिए उपयोग करता है । हालाँकि, यह --versionध्वज का समर्थन नहीं करता है ।

यदि मैं चलाता busybox grepहूं तो मुझे व्यस्त बॉक्स का संस्करण दिखाई देता है। क्या मुझे संगतता जोड़ने के लिए बस इसका उपयोग करना चाहिए? वहाँ एक बेहतर तरीका है कि मैं निर्भरता स्थापित किए बिना कोड गंध को दूर करने के लिए ऐसा कर सकता हूं।


आप आम तौर पर वितरण का पता लगाने की कोशिश कर सकते हैं और फिर grepबाइनरी के लिए सही सिंटैक्स का उपयोग कर सकते हैं : unix.stackexchange.com/questions/6345/… - भी करने के लिए पूर्ण पथ का उपयोग करने का प्रयास करें /bin/grep
13

1
उपयोग - IMHO आप पहले से ही अपने प्रश्न, जवाब busyboxकी grep। यह विभिन्न प्लेटफार्मों के अनुरूप होगा। केवल एक चीज यह है कि busyboxसभी प्रणालियों पर डिफ़ॉल्ट रूप से स्थापित नहीं है। एक अन्य दृष्टिकोण awkपार्सिंग के लिए उपयोग करना है, यह डिफ़ॉल्ट रूप से सभी यूनिक्स आधारित प्रणालियों के साथ आता है, यहां तक ​​कि प्लेटफार्मों को छीन लिया गया है, बस केवल संगत awk के आदेशों का उपयोग करें जो इसके सभी स्वादों (क्लासिक awk, nawk, gawk ...) में मौजूद हैं, यह अधिक पोर्टेबल होगा।
एलेक्स

धन्यवाद, एलेक्स। एसओ पर यह उत्तर पीसीआर को जोड़ने के लिए कुछ इतिहास प्रदान करता है जो POSIX को पोस्ट करता है और इसलिए, awkबेहतर पोर्टेबिलिटी के लिए उपयोग करने के आपके सुझाव पर ध्यान दिया जाएगा। ऐसा लगता है कि समस्या की जड़, हालांकि, या तो विस्तारित बग का उपयोग करते समय बीएसडी grep में एक बग या अनिर्दिष्ट सुविधा हो सकती है
जोश हब्दास

जवाबों:


0

किसी भी लंबे समय तक इंतजार नहीं किया जा सकता है इसलिए मैंने इस पर कुछ नए आईबॉल डाल दिए और निम्नलिखित समाधान के साथ आया, जिसने जीएनयू, बीएसडी और बिजीबॉक्स ग्रीप का उपयोग करके अच्छी तरह से परीक्षण किया, और वीर्य के लिए समर्थन में सुधार किया:

egrep -o "\"version\".*[^,]*," <<< "$meta" | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" '

यह ERE grep को एक रेगेक्स (एक टोपी की नोक के साथ ) कहकर काम करता है और cutअनुगामी अल्पविराम से स्लाइस करने के लिए उपयोग करता है, दाएं हाथ की तरफ से सब कुछ पकड़ो :, स्ट्रिंग को ट्रिम करें और मौजूद किसी भी दोहरे उद्धरण चिह्नों को हटा दें।

यह देखते हुए $metaकी {"version":"5.5.0-beta4",}वास्तव में वापस आ जाएगी 5.5.0-beta4
यह देखते हुए $metaकी "version" : 1,वास्तव में वापस आ जाएगी 1

मान लेता versionहै कि JSON बूँद में फ़ील्ड अंतिम क्षेत्र नहीं है जो पठनीयता के लिए एक व्यापार बंद है।

मूल प्रश्न परिणाम में लागू:

vers=$(echo "$meta" | egrep -o "\"version\".*[^,]*," | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" ')

ग्रीप के संस्करण का पता लगाने और कोड गंध को दूर करने की आवश्यकता को समाप्त करना।

अद्यतन करें:

मैं अंततः एसओ पर एक अनुवर्ती प्रश्न का उपयोग करके अधिक सुरुचिपूर्ण समाधान का नेतृत्व कर रहा था ।sed

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.