2009-07-01 14 views
40

में स्टार पर हस्ताक्षर का उपयोग करना मैं linux/bashग्रेप

में सबस्ट्रिंग "abc" एक विशिष्ट फ़ाइल के लिए खोज करने के लिए कोशिश कर रहा हूँ तो मैं कार्य करें:

grep '*abc*' myFile 

यह कुछ भी नहीं देता है।

लेकिन अगर मैं कार्य करें:

grep 'abc' myFile 

यह मैचों सही ढंग से वापस आती है।

अब, यह मेरे लिए कोई समस्या नहीं है। लेकिन क्या होगा अगर मैं एक अधिक जटिल स्ट्रिंग के लिए grep करना चाहते हैं, कहते हैं कि

*abc * def * 

मैं इसे ग्रेप का उपयोग कर कैसे पूरा होगा? विस्तारित नियमित अभिव्यक्ति समर्थन

के लिए

+3

ग्रेप के बाद है ही नहीं करता ' अधिकांश प्लेटफॉर्म पर वाइल्डकार्ड का समर्थन नहीं करते हैं। वाइल्डकार्ड का उपयोग करने के लिए आपको egrep का उपयोग करना होगा। शैल के पास एक अलग वाक्यविन्यास होता है। खोल में "*" है। Egrep में यह एक ऑपरेटर है जो "पिछली इकाई में से कई को" कहता है। Grep में, यह सिर्फ एक नियमित चरित्र है। – PanCrit

+0

@ पैनक्रिट: '*' का मतलब grep और egrep में एक ही बात है: यह एक * क्वांटिफायर * है जिसका मतलब शून्य या अधिक पिछले परमाणु है। शैल द्वारा उपयोग किए गए * वाइल्डकार्ड * की तुलना में यह एक पूरी तरह से अलग अवधारणा है। –

उत्तर

63

तारांकन सिर्फ repetition operator है, लेकिन आपको यह बताना होगा कि आप क्या दोहराते हैं। /*abc*/ एबी और शून्य या अधिक सी युक्त स्ट्रिंग से मेल खाता है (क्योंकि दूसरा * सी पर है; पहला अर्थहीन है क्योंकि इसे दोहराने के लिए कुछ भी नहीं है)। यदि आप कुछ भी मिलान करना चाहते हैं, तो आपको .* कहना होगा - डॉट का मतलब किसी भी चरित्र (within certain guidelines) है। अगर आप सिर्फ एबीसी से मेल खाना चाहते हैं, तो आप बस grep 'abc' myFile कह सकते हैं। आपके अधिक जटिल मिलान के लिए, आपको .* - grep 'abc.*def' myFile का उपयोग करने की आवश्यकता है जो एक स्ट्रिंग से मेल खाएगा जिसमें एबीसी शामिल है, इसके बाद वैकल्पिक रूप से कुछ के साथ def के साथ def।

अद्यतन एक टिप्पणी के आधार पर:

एक नियमित अभिव्यक्ति में * बिल्कुल कंसोल में * के रूप में ही नहीं है। कंसोल में, * glob construct का हिस्सा है, और केवल वाइल्डकार्ड के रूप में कार्य करता है (उदाहरण के लिए ls *.log .log में समाप्त होने वाली सभी फ़ाइलों को सूचीबद्ध करेगा)। हालांकि, नियमित अभिव्यक्तियों में, * एक संशोधक है, जिसका अर्थ है कि यह केवल इससे पहले वर्ण या समूह पर लागू होता है। यदि आप वाइल्डकार्ड के रूप में कार्य करने के लिए नियमित अभिव्यक्तियों में * चाहते हैं, तो आपको .* का उपयोग पहले उल्लेख किया गया है - डॉट एक वाइल्डकार्ड वर्ण है, और स्टार, जब डॉट को संशोधित करते हैं, तो इसका अर्थ है एक या अधिक बिंदु; अर्थात। किसी भी चरित्र के एक या अधिक खोजें।

+1

मुझे लगता है कि प्रश्नकर्ता शेल वाइल्डकार्ड और नियमित अभिव्यक्तियों के बीच के अंतर के बारे में उलझन में है। मुझे यह भी संदेह है कि अधिक जटिल अभिव्यक्ति होगी: grep 'abc। * Def' (कम से कम एक स्थान मौजूद है - संभवतः दो मैंने लिखा है)। –

+1

असल में, प्रश्नकर्ता को यह समझ में नहीं आता कि 'एबीसी' '^ abc $' जैसी ही नहीं है :- डी – Massa

+1

हां, मैं ग्लोब और पूर्ण नियमित अभिव्यक्तियों के बीच उलझन में था। मैं * डॉट के बिना खोल पर कुछ भी मिलान करने का मतलब उपयोग करता हूं। – Saobi

8

'स्टार हस्ताक्षर "केवल तभी सार्थक है अगर वहाँ उसके सामने कुछ है। यदि उपकरण नहीं है (इस मामले में grep) सिर्फ इसे एक त्रुटि के रूप में व्यवहार कर सकता है। उदाहरण के लिए:

'*xyz' is meaningless 
'a*xyz' means zero or more occurrences of 'a' followed by xyz 
+4

* अर्थहीन नहीं है; इसका सिर्फ सामान्य अर्थ नहीं है (पुनरावृत्ति का) लेकिन इसका मतलब है "मैं एक सितारा हूं"। यह एक्स, वाई, और जेड के बाद एक स्टार युक्त एक रेखा से मेल खाएगा। –

+1

@ जोनाथन यह उपकरण पर निर्भर करता है। –

0

'*' पिछले आइटम के लिए एक संशोधक के रूप में काम करता है। तो 'ab' के लिए 'abc * def' खोजों के बाद 0 या अधिक 'c' द्वारा 'def' द्वारा अनुवर्ती किया गया है।

आप जो चाहते हैं वह 'abc। * Def' है जो 'abc' की खोज करता है जिसके बाद 'def' द्वारा अनुयायी वर्णों की संख्या होती है।

7

डॉट कैरेक्टर का अर्थ है किसी भी चरित्र से मेल खाता है, इसलिए '। *' का अर्थ है किसी भी चरित्र की शून्य या अधिक घटनाएं। आप शायद '*' के बजाय '। *' का उपयोग करना चाहते हैं।

आह, बकवास,

1

उपयोग ग्रेप -पी - जो पर्ल शैली नियमित अभिव्यक्ति के लिए समर्थन सक्षम बनाता है।

grep -P "abc.*def" myfile 
4

अभिव्यक्ति आप की कोशिश की, उन है कि उदाहरण के लिए लिनक्स में शेल कमांड लाइन पर काम की तरह, एक "glob" कहा जाता है। ग्लोब एक्सप्रेशन पूर्ण regular expressions नहीं है, जो कि grep देखने के लिए स्ट्रिंग निर्दिष्ट करने के लिए उपयोग करता है। Here मतभेदों के बारे में पोस्ट (पुरानी, ​​छोटी) है। ग्लोब एक्सप्रेशन (जैसा कि "एलएस *" में) को शैल द्वारा ही व्याख्या किया जाता है।

ग्लब्स से आरईएस में अनुवाद करना संभव है, लेकिन आपको आमतौर पर अपने सिर में ऐसा करने की आवश्यकता होती है।

+1

यह केवल एक ग्लोब है यदि इसे खोल द्वारा पार्स किया गया है। चूंकि वह एकल उद्धरण के अंदर खोज स्ट्रिंग को संरक्षित कर रहा है, इसलिए खोल अकेले स्ट्रिंग को छोड़ देता है, और इसे grep में argv में बरकरार रखता है। –

4

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

0

यह हो सकता है हो सकता है इस सवाल का जवाब आप देख रहे हैं:

grep abc MyFile | grep def 

केवल बात है ... यह होगा उत्पादन लाइनों थे "def" से पहले या "abc"

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