grep regex व्हाट्सएप व्यवहार


87

मेरे पास एक टेक्स्टफ़ाइल है, जिसमें कुछ इस तरह है:

12,34 EUR 
 5,67 EUR
 ...

'EUR' से पहले एक व्हाट्सएप है और मैं 0, XX EUR को अनदेखा करता हूं।

मैंने कोशिश की:

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => didn't match !

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s[E]UR' => worked !

किसी ने मुझसे व्याख्या कर सकते हैं कृपया, मैं क्यों उपयोग नहीं कर सकते \s, लेकिन \s*और \s[E]मिलान किया?

OS: Ubuntu 10.04, grep v2.5

जवाबों:


122

यह \sgrep 2.5 और नए संस्करणों (पुराने grep में बग) के बीच की हैंडलिंग में एक व्यवहार अंतर जैसा दिखता है । मैं grep 2.5.4 के साथ आपके परिणाम की पुष्टि करता हूं, लेकिन आपके सभी चार grep 2.6.3 (Ubuntu 10.9) का उपयोग करते समय काम करते हैं।

ध्यान दें:

GNU grep 2.5.4
echo "foo bar" | grep "\s"
   (doesn't match)

जहाँ तक

GNU grep 2.6.3
echo "foo bar" | grep "\s"
foo bar

संभवतः कम परेशानी (जैसा \sकि प्रलेखित नहीं है):

Both GNU greps
echo "foo bar" | grep "[[:space:]]"
foo bar

मेरी सलाह है कि इसके इस्तेमाल से बचें \s... उपयोग करें [ \t]*या [[:space:]]इसके बजाय कुछ ऐसा करें।


24
या सिर्फ [:space:], पूर्व के लिए। इस तरह:cat file | grep "[[:space:]]"
किरिल किरोव

इस बग अनुरोध मेल-archive.com/bug-grep@gnu.org/msg02686.html के अनुसार grep (देखने के अन्य बिंदु) के नए संस्करण में एक बग प्रतीत होता है, लेकिन अंतिम विवरण क्यों मेल खाता है?
Milde

1
@ माइल्ड, फॉलोअप पोस्ट मेल-archive.com/bug-grep@gnu.org/msg02689.html पर ध्यान दें जहां उस बग रिपोर्ट को अवैध और बंद चिह्नित किया गया था (इसलिए इसे नए grep में बग नहीं माना जाता है)।
कमल

2
@ माइल्ड, मेरे द्वारा जांचे गए (पुराने या नए) किसी भी grep डॉक्यूमेंटेशन का वास्तव में कोई संदर्भ नहीं है \s। मैं कहूंगा कि इसका व्यवहार "अपरिभाषित" है। इसके बजाय [: space:] का उपयोग करें, जो पुराने और नए grep में प्रलेखित के रूप में काम करता है।
कमल

धन्यवाद, मैं भविष्य में समस्या से बचने के लिए [: space:] का उपयोग करूंगा
Milde
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.