2012-04-13 6 views
11

मैं एक वीबी स्रोत फ़ाइल में कार्यों की घटनाओं को खोजने के लिए निम्न grep क्वेरी का उपयोग करता हूं।एक वैकल्पिक शब्द को शामिल करने के लिए grep कैसे करें?

grep -nri "^\s*\(public\|private\|protected\)\s*\(sub\|function\)" formName.frm 

इस मैच - अतिरिक्त शब्द "स्थैतिक" वहाँ में की वजह से

Private Static Sub SaveCustomer() 

-

Private Sub Form_Unload(Cancel As Integer) 
    Private Sub lbSelect_Click() 
    ... 

हालांकि, यह जैसे कार्यों चूक जाता है। Grep क्वेरी में इस "वैकल्पिक" शब्द के लिए कैसे खाता है?

उत्तर

12

आप एक \? उपयोग कर सकते हैं कुछ वैकल्पिक बनाने के लिए:

grep -nri "^\s*\(public\|private\|protected\)\s*\(static\)\?\s*\(sub\|function\)" formName.frm 

इस मामले में, पूर्ववर्ती समूह है, जो स्ट्रिंग "स्थिर" होता है, वैकल्पिक है (अर्थात हो सकता है 0 या 1 बार)।

+0

ठीक है। जवाब के लिए धन्यवाद। – CodeBlue

+0

क्या बैकस्लैश के बिना एक प्रश्न चिह्न का संकेत होगा? – CodeBlue

+1

एक शाब्दिक @CodeBlue?। जब आप इस तरह 'grep' का आह्वान करते हैं, तो यह बीआरई (मूल नियमित अभिव्यक्तियों) का उपयोग करता है। बीआरई में, आपको एम से बचने की जरूरत है "अधिक उन्नत" अभिव्यक्तियों के लिए मेटाएक्टएक्टर्स में से कोई भी। जैसा कि एक और जवाब में उल्लेख किया गया है, यदि आप पारित कर चुके थे तो आपको इसे बचाना नहीं होगा (असल में, इससे बचने से यह एक शाब्दिक मैच का कारण बन जाएगा?)! समझाए जाने के लिए – FatalError

6

ग्रेप, प्रमुखता बुद्धिमान का उपयोग करते समय:

* : 0 or many 
+ : 1 or many 
? : 0 or 1 <--- this is what you need. 

निम्न उदाहरण (जहां बहुत शब्द अपने स्थिर के लिए खड़ा है) को देखते हुए:

I am well 
I was well 
You are well 
You were well 
I am very well 
He is well 
He was well 
She is well 
She was well 
She was very well 

हम केवल

चाहते हैं
I am well 
I was well 
You are well 
You were well 
I am very well 

हम '?' का उपयोग करेंगे (यह भी शून्य या एक समय 'बहुत' के बाद अंतरिक्ष से सावधान नियुक्ति नोटिस कि हम 'बहुत' शब्द चाहता हूँ उल्लेख करने के लिए:

egrep "(I|You) (am|was|are|were) (very)?well" file.txt 

आपने यही अनुमान लगाया रूप में, मैं egrep का उपयोग करने के लिए आमंत्रित कर रहा हूँ बजाय की ग्रेप (आप ग्रेप -E कोशिश कर सकते हैं, के लिए विस्तारित रेग्युलर एक्सप्रेशंस)।

+0

egrep क्या करता है कि grep नहीं करता है? – CodeBlue

+0

मुझे लगता है कि आप अपरकेस ई – CodeBlue

+0

के साथ grep -E का मतलब है जैसा कि आपने शायद देखा है, egrep विस्तारित नियमित अभिव्यक्तियों को पहचानता है। और मैंने अपना जवाब तय कर दिया। यह वास्तव में अपरकेस ई है, धन्यवाद। –

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