मेरे पास एक 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
हूं तो मुझे व्यस्त बॉक्स का संस्करण दिखाई देता है। क्या मुझे संगतता जोड़ने के लिए बस इसका उपयोग करना चाहिए? वहाँ एक बेहतर तरीका है कि मैं निर्भरता स्थापित किए बिना कोड गंध को दूर करने के लिए ऐसा कर सकता हूं।
busybox
की grep
। यह विभिन्न प्लेटफार्मों के अनुरूप होगा। केवल एक चीज यह है कि busybox
सभी प्रणालियों पर डिफ़ॉल्ट रूप से स्थापित नहीं है। एक अन्य दृष्टिकोण awk
पार्सिंग के लिए उपयोग करना है, यह डिफ़ॉल्ट रूप से सभी यूनिक्स आधारित प्रणालियों के साथ आता है, यहां तक कि प्लेटफार्मों को छीन लिया गया है, बस केवल संगत awk के आदेशों का उपयोग करें जो इसके सभी स्वादों (क्लासिक awk, nawk, gawk ...) में मौजूद हैं, यह अधिक पोर्टेबल होगा।
awk
बेहतर पोर्टेबिलिटी के लिए उपयोग करने के आपके सुझाव पर ध्यान दिया जाएगा। ऐसा लगता है कि समस्या की जड़, हालांकि, या तो विस्तारित बग का उपयोग करते समय बीएसडी grep में एक बग या अनिर्दिष्ट सुविधा हो सकती है ।
grep
बाइनरी के लिए सही सिंटैक्स का उपयोग कर सकते हैं : unix.stackexchange.com/questions/6345/… - भी करने के लिए पूर्ण पथ का उपयोग करने का प्रयास करें/bin/grep
।