2013-01-15 19 views
6

मेरे पास एक टेक्स्ट फ़ाइल है, जिसमें dd/mm/yyyy (उदाहरण 20/12/2012) के रूप में एक तिथि है।बैश (grep) regex अप्रत्याशित रूप से प्रदर्शन कर रहा है

मैं grep उपयोग करने के लिए तिथि को पार्स और टर्मिनल में यह दिखाने के लिए कोशिश कर रहा हूँ, और यह सफल होता है, जब तक मैं एक निश्चित मामले को पूरा:

ये मेरी परीक्षण मामलों हैं:

  • grep -E "\d*" रिटर्न 20/12/2012
  • grep -E "\d*/" रिटर्न 20/12/2012
  • grep -E "\d*/\d*" रिटर्न 20/12/2012
  • grep -E "\d*/\d*/" रिटर्न कुछ भी नहीं
  • grep -E "\d+" भी रिटर्न कुछ भी नहीं

किसी ने मुझे समझा सकते हैं कारण है कि मैं इस अप्रत्याशित व्यवहार मिलता है?

संपादित: मैं एक ही व्यवहार करता है, तो मैं ' (मजबूत उद्धरण) के लिए " (कमजोर उद्धरण) स्थानापन्न मिलता है।

उत्तर

7

आपके द्वारा उपयोग किए गए वाक्यविन्यास (\d) Bash's Extended regex द्वारा पहचाना नहीं गया है।

grep -P का उपयोग करें जो इसके बजाय पर्ल रेगेक्स (पीसीआरई) का उपयोग करता है। उदाहरण के लिए:

grep -P "\d+/\d+/\d+" input.txt 
grep -P "\d{2}/\d{2}/\d{4}" input.txt # more restrictive 

या, विस्तारित regex के साथ रहना, \d के स्थान पर [0-9] का उपयोग करें:

grep -E "[0-9]+/[0-9]+/[0-9]" input.txt 
grep -E "[0-9]{2}/[0-9]{2}/[0-9]{4}" input.txt # more restrictive 
+0

थैंक्स मैन जो नौकरी करता था। – NlightNFotis

+0

आपका स्वागत है। –

2

grep और egrep/grep -E\d पहचान नहीं है। आपके पहले तीन पैटर्न काम का कारण तारांकन की वजह से है जो \d वैकल्पिक बनाता है। यह वास्तव में नहीं मिला है।

[0-9] या [[:digit:]] का उपयोग करें।

+0

आपको मेरे पास +1 मिला है, क्योंकि आपने मुझे बताया है कि क्या गलत है, लेकिन वास्तव में आपके विकल्प मेरे लिए काम नहीं करते हैं :( – NlightNFotis

4

तुम भी ई के बजाय -पी इस्तेमाल कर सकते हैं जो ग्रेप PCRE सिंटैक्स का उपयोग करने की अनुमति देता है

grep -P "\d+/\d+" file 

भी काम करता है।

+0

आपके उत्तर के लिए धन्यवाद। – NlightNFotis

2

इस तरह के मामलों की समस्या निवारण में सहायता के लिए, ध्वज उपयोगी हो सकता है क्योंकि यह केवल लाइन के मिलान किए गए हिस्से को दिखाता है। आपके मूल अभिव्यक्तियों के साथ:

grep -Eo "\d*" कुछ भी नहीं लौटाता है - एक सुराग जो \ n वह नहीं कर रहा है जो आपने सोचा था।

grep -Eo "\d*/" रिटर्न/(दो बार) - पुष्टि है कि स्लेश होने पर \ d मेल नहीं खा रहा है।

दूसरों के द्वारा बताया गया है, -पी झंडा मुद्दे को पहचानने "\ d" द्वारा, हल करती है लेकिन धमाका गोलियां 'जवाब स्पष्ट करने के लिए, आप भी ई इस प्रकार इस्तेमाल कर सकते हैं:

grep -Eo "[[:digit:]]*/[[:digit:]]*/" रिटर्न 20/12/

संपादित करें: (! धन्यवाद):

grep -E --color "[[:digit:]]*/[[:digit:]]*/" रिटर्न @ शॉन ठोड़ी से एक टिप्पणी के अनुसार, --color इसी तरह लाइन है कि मिलान किया जाता है, जबकि अभी भी पूरी पंक्ति दिखा के कुछ भागों को उजागर करने के लिए इस्तेमाल किया जा सकता है 20/12/ 2012 (यहां रंग नहीं कर सकता है, लेकिन बोल्ड "20/12 /" भाग रंग में होगा)

+0

'-o' का उपयोग करने के बारे में अच्छा संकेत। वैकल्पिक रूप से, लौटा आउटपुट के बीच मिलान पाठ को हाइलाइट करने के लिए '--color' का उपयोग करें। –

+0

उस उत्तर के लिए धन्यवाद! यह एक शानदार है। यह केवल एक शर्म की बात है कि मुझे केवल एक जवाब स्वीकार करना है। – NlightNFotis

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