2009-11-15 13 views
9

इनपुटयह 'grep -o` क्यों विफल रहता है, और मुझे इसके आसपास कैसे काम करना चाहिए?

echo abc123def | grep -o '[0-9]*' 

एक कंप्यूटर पर (जीएनयू ग्रेप 2.5.4 के साथ) को देखते हुए इसे रिटर्न 123, और एक अन्य पर (जीएनयू ग्रेप 2.5.1) के साथ यह खाली स्ट्रिंग देता है। क्या कोई स्पष्टीकरण है कि grep 2.5.1 क्यों विफल रहता है, या यह सिर्फ एक बग है? मैं grep -o का उपयोग इस तरह से एक बैश स्क्रिप्ट में कर रहा हूं कि मैं विभिन्न कंप्यूटरों पर चलाने में सक्षम होना चाहता हूं (जिसमें grep के विभिन्न संस्करण हो सकते हैं)। लगातार व्यवहार पाने के लिए कोई "सही तरीका" है?

+1

आप एक रेगेक्स पर grep क्यों करना चाहते हैं जो शून्य अक्षरों से मेल खा सकता है, वैसे भी? मैं उम्मीद करता हूं कि यह प्रत्येक पंक्ति से मेल खाए, न केवल उन अंकों के साथ लाइनों। –

उत्तर

9

हाँ, 2.5.1 के -o हैंडलिंग गाड़ी था: http://www.mail-archive.com/[email protected]/msg00993.html

Grep शायद इस के लिए सही उपकरण नहीं है; sed या tr या यहां तक ​​कि perl वास्तविक कार्य के आधार पर बेहतर हो सकता है।

+0

+1: लेकिन यदि मामूली जीएनयू 'grep' संस्करणों (हालांकि बग के बावजूद) के बीच भिन्नता है तो विभिन्न कंप्यूटरों के बीच स्थिरता खोजने का अधिक अवसर नहीं है। हालांकि, कई अन्य उपकरण हैं। – pavium

+1

किसी अन्य उपकरण का उपयोग करने के लिए, सही समाधान के बिना एक अच्छा जवाब नहीं है। एक सबूत के रूप में, ज्यादातर मामलों में इसे शुद्ध बैश के उपयोग से हल किया जा सकता है। आपने मेरे लिए एक सटीक समाधान शामिल नहीं किया था। – kisp

0

यह इसी तरह के परिणाम दे देंगे:

echo abc123def | sed -n 's/[^0-9]*\([0-9]\+\).*/\1/p' 

आपका प्रश्न this one की एक लगभग डुप्लिकेट है।

2

आप खोल का उपयोग कर सकते हैं। इसके तेजी से

$ str=abc123def 
$ echo ${str//[a-z]/} 
123 
2

मैं एक ही मुद्दा था और पाया कि egrep कि मशीन पर स्थापित किया गया था। एक त्वरित समाधान

echo abc123def | egrep -o '[0-9]*' 
-1

उपयोग कर रहा था क्योंकि आप एक regex का उपयोग कर रहे हैं ताकि आप या तो उपयोग करना चाहिए: (जैसे सेबस्टियन पोस्ट)

  1. ग्रेप -E
  2. egrep।

शुभकामनाएं!

+2

-E/egrep * विस्तारित * नियमित अभिव्यक्तियों के लिए आवश्यक है; '[0-9] *' एक वैध मूल नियमित अभिव्यक्ति है। ('Grep' में 're' नियमित अभिव्यक्ति के लिए खड़ा है)। शायद 2.5.1 में बग विस्तारित नियमित अभिव्यक्ति समर्थन में मौजूद नहीं था, लेकिन केवल एक तथ्य यह है कि एक नियमित अभिव्यक्ति का उपयोग किया जाता है इसका मतलब यह नहीं है कि आपको -E की आवश्यकता है। – chepner

संबंधित मुद्दे