क्यों `grep फिल्म *` विफल रहता है?


9

मैंने पाया कि echo file|grep fil*विफल रहता है, लेकिन echo abcd|grep abc*सफल होता है।

मुझे यह समझ में नहीं आता, क्या कोई समझा सकता है?


क्या आप सिस्टम और grep का संस्करण जोड़ सकते हैं? ऐसा इसलिए है क्योंकि gnugrep 2.16 (Ubuntu 14.04 LTS के तहत) के साथ, यह कोई त्रुटि उत्पन्न नहीं करता है (कोड से बाहर निकलें 0) और यह पहले तीन अक्षरों से मेल खाता है। उदाहरण के लिए, ई के echo file|grep fil*साथ उत्तर fil
हस्त्तूर

3
@ हस्तूर समस्या नियमित अभिव्यक्ति से पहले फ़ाइल नाम के विस्तार के कारण होती है। मेरी वर्किंग डायरेक्टरी में फिल्म द्वारा फाइल प्रीफिक्सड है, लेकिन एबीसी द्वारा उपसर्गित फाइल नहीं है, इसलिए फिल्म * को फ़ाइल नाम से बदल दिया जाता है, लेकिन एबीसी * अपरिवर्तित है।
tmpbin

धन्यवाद मैं इसके बारे में नहीं सोचा था। जब मैं अपनी कोशिश करता हूं तो मैं उन्हें एक नई निर्देशिका में
आज़माता हूं

जवाबों:


31

आपके उदाहरण के साथ दो समस्याएं हैं।

प्राथमिक एक आप यह सोचते हैं कि कर रहे हैं वह यह है कि नियमित अभिव्यक्ति के रूप में ही काम करते हैं ग्लोब पैटर्न में है कि *एक वाइल्डकार्ड अर्थ है "वर्णों के किसी अनुक्रम।" नियमित अभिव्यक्ति में, *साधन के बजाय "पिछले परमाणु के किसी भी संख्या", तो fil*इसका मतलब है fजिसके बाद iशून्य या अधिक के बाद lपात्रों। आपको grep fil.*अपेक्षित अर्थ प्राप्त करने के लिए कहने की आवश्यकता है: ."कोई भी एकल वर्ण, इसलिए .*इसका अर्थ है" वर्णों का कोई भी क्रम। "

कम समस्या यह है कि आप बिना किसी विशेष वर्ण का उपयोग कर रहे हैं, जिसका अर्थ ग्लोब नियमों के तहत कुछ है, जिसका अर्थ है कि शेल उन्हें व्याख्या कर सकता है। यदि आपके पास ग्लोब पैटर्न से मेल खाने वाली स्थानीय निर्देशिका में कोई फ़ाइल है fil*या abc*, शेल उन्हें विस्तारित करेगा , तो grepविस्तारित फ़ाइल नाम को पैटर्न के रूप में मिलेगा, न कि इरादा आरई। जब भी आप कमांड लाइन पर ऐसे पात्रों का उपयोग कर रहे हैं, तो आपको उन्हें उद्धृत करना चाहिए echo file | grep 'fil.*':।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.