Grep में स्टार साइन का उपयोग करना


90

मैं linux / bash में एक विशिष्ट फ़ाइल में "abc" के विकल्प की खोज करने की कोशिश कर रहा हूं

इसलिए मैं करता हूँ:

grep '*abc*' myFile

यह कुछ भी नहीं लौटाता है।

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

grep 'abc' myFile

यह मैचों को सही ढंग से लौटाता है।

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

*abc * def *

मैं इसे grep का उपयोग करके कैसे पूरा करूंगा?


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

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

जवाबों:


124

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

टिप्पणी पर आधारित अपडेट:

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


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

1
वास्तव में, प्रश्नकर्ता को यह समझ में नहीं आता है कि 'abc' '^ abc $' जैसी चीज नहीं है :-D
मस्सा

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

1
grep का *अर्थ "0 या अधिक" है, और grep डिफ़ॉल्ट रूप से लालची है। ध्यान दें कि ग्रेप में बुनियादी नियमित अभिव्यक्ति अक्षरों से परे ?, +, {, |, (, और )उनके विशेष अर्थ खो देते हैं। अधिक जानकारी: grep regexps
KrisWebDev

25

डॉट कैरेक्टर का मतलब किसी भी कैरेक्टर से मेल खाता है, इसलिए किसी भी कैरेक्टर .*का जीरो या उससे ज्यादा होना। आप शायद .*सिर्फ के बजाय उपयोग करने के लिए मतलब है *


डॉट एक मेटा कैरेक्टर है जो नई लाइनों को छोड़कर किसी भी कैरेक्टर को स्वीकार करता है ।
अभिषेक कमल

12

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

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

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

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


6

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

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


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

4

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


2
fgrepअब पदावनत grep -fकिया जाता है , इसका उपयोग किया जाना चाहिए।
प्रोमेथियस

1
वह "grep -F" है। अच्छा राजभाषा fgrep "पदावनत" हो सकता है, लेकिन वे इसे दूर नहीं ले जा रहे हैं जबकि मैं अभी भी जीवित हूं।
एंड्रयू बील्स


1

यह वह उत्तर हो सकता है जिसकी आप तलाश कर रहे हैं:

grep abc MyFile | grep def

केवल एक चीज है ... यह आउटपुट लाइनें "एबीसी" से पहले या बाद में "डीई" थी


1

यह मेरे लिए काम किया:

grep "। * $ {expr}" - डबल-कोट्स के साथ, बिंदी से पहले। जहां "एक्सप्र" लाइन के अंत में आपको जो भी स्ट्रिंग की आवश्यकता होती है।

मानक यूनिक्स grep w / बाहर अतिरिक्त स्विच।


0

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

आप जो चाहते हैं, वह 'एबीसी' है। '' डिफ 'जो' एबीसी 'खोजता है, उसके बाद किसी भी संख्या में वर्ण' डिफ 'द्वारा फॉल किए जाते हैं।

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