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.