Grep 'या' regex समस्या


65

मैं एक regex के साथ grep का उपयोग करने की कोशिश कर रहा हूं एक फ़ाइल में लाइनों को खोजने के लिए जो 2 संभावित तारों में से 1 से मेल खाती है। यहाँ मेरा grep है:

$ grep "^ID.*(ETS|FBS)" my_file.txt

उपरोक्त grep कोई परिणाम नहीं देता है। हालाँकि अगर मैं या तो निष्पादित करता हूँ:

$ grep "^ID.*ETS" my_file.txt  

या

$ grep "^ID.*FBS" my_file.txt  

मैं विशिष्ट लाइनों से मेल खाता हूं। मेरा OR regex मेल क्यों नहीं कर रहा है? मदद के लिए अग्रिम धन्यवाद!

जवाबों:


94

सामान्य regex, अक्षर के साथ (, |और )जरूरत भाग निकले किया जाना है। इसलिए आपको उपयोग करना चाहिए

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt

जब आप विस्तारित रेगेक्स ( -E) विकल्प का उपयोग करते हैं तो आपको पलायन की आवश्यकता नहीं होती है । देखें man grep, अनुभाग " Basic vs Extended Regular Expressions"।


10
तुम भी उपयोग कर सकते हैं egrepके बजाय grep -E
रिकार्डो मुर्री

2
@RiccardoMurri मिशाल का उत्तर बताता है कि egrep (और fgrep) पदावनत हैं (भले ही वे अभी भी काम कर सकते हैं)।
टिमो

27

यदि आप कई शाखाओं ( |जैसे or) का उपयोग करना चाहते हैं , तो अधिक संगत होने के लिए, यह स्पष्ट रूप से बेहतर है कि आप "आधुनिक आरई" उर्फ ​​का उपयोग करना चाहते हैं। ERE।

ऐसा करने के लिए, grep -E का उपयोग करें :

grep -E "^ID.*(ETS|FBS)" my_file.txt

आरई, ईआरई और पूरे "आधुनिक" ईआर कहानी के बारे में अधिक जानने के लिए देखें man 7 regex

वैकल्पिक रूप से आप के egrepबजाय का उपयोग कर सकते हैं grep, लेकिन जैसा कि आप से पढ़ सकते हैं man grep:

egrep grep -E के समान है। frerep grep -F के समान है

(...)

प्रत्यक्ष आह्वान जैसे कि एग्रेप या एफग्रेप को पदावनत किया जाता है


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