2009-10-03 19 views
14

मान लीजिए कि मेरे पास कई स्ट्रिंग हैं: str1 और str2 और str3।grep egrep एकाधिक-स्ट्रिंग्स

  • सभी तारों वाली रेखाएं कैसे ढूंढें?
  • उन रेखाओं को कैसे ढूंढें जिनमें से कोई भी हो सकता है?
  • और स्ट्रॉ 1 और str2 और str3 [) दोनों लाइनों को कैसे ढूंढें, लेकिन दोनों नहीं?]?

उत्तर

-2

व्यक्तिगत रूप से, मैं इसे grep के साथ कुछ जोड़ने के बजाय पेर्ल में करता हूं।

उदाहरण के लिए

, पहले एक के लिए:

while (<FILE>) 
{ 
    next if ! m/pattern1/; 
    next if ! m/pattern2/; 
    next if ! m/pattern3/; 

    print $_; 
} 
+3

-1: खोज आयन नहीं है: ऐसा करने का सबसे अच्छा टूल क्या है, लेकिन मैं इसे grep के साथ कैसे कर सकता हूं। – quosoo

+3

और जवाब है "grep के साथ ऐसा न करें, आप पागल हो जाएंगे" –

+0

@quosoo: यूनिक्स प्रोग्रामर के बीच, "grep" या तो grep प्रोग्राम विशेष रूप से या किसी शरीर को खोजने की सामान्य समस्या का संदर्भ ले सकता है तार या पैटर्न के लिए पाठ। यह स्पष्ट नहीं है कि टिम का उपयोग किस उद्देश्य से किया गया था, इसलिए मुझे लगता है कि पॉल टॉम्बलिन का जवाब बिंदु पर है। –

8

आप यथोचित अग्रदर्शी "सभी" या "इस के साथ साथ उन लोगों में से या तो" मामलों क्योंकि grep का समर्थन नहीं करता नहीं कर सकते। पर्ल का प्रयोग करें। "किसी भी" मामले के लिए, यह egrep '(str1|str2|str3)' file है।

"सभी" मामला ऐसा करने के लिए अनुचित तरीका है:

egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file 

यानी आप क्रमपरिवर्तन बाहर का निर्माण। यह निश्चित रूप से करने के लिए एक हास्यास्पद बात है।

के लिए "इस के साथ साथ उन लोगों में से या तो", ठीक उसी प्रकार:

egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file 
27

यह तीन सवालों की तरह दिखता है। इन प्रकार के अभिव्यक्तियों को एक साथ रखने का सबसे आसान तरीका एकाधिक पाइपों के साथ है। उसमें कोई शर्म की बात नहीं है, विशेष रूप से क्योंकि एक नियमित अभिव्यक्ति (egrep का उपयोग करके) अनजाने में होगा क्योंकि आपको लगता है कि आप स्वतंत्रता आदेश चाहते हैं।

तो, क्रम में,

  1. ग्रेप str1 | grep str2 | ग्रेप str3

  2. egrep '(str1 | str2 | str3)'

  3. ग्रेप str1 | egrep '(str2 | str3)'

तुम कर सकते हो "और" एक आदेश स्वतंत्र egrep का उपयोग कर रास्ते में फार्म, लेकिन मुझे लगता है कि आप मिल जाएगा यह आसान पाइप greps का उपयोग कर आदेश स्वतंत्र ands करने के लिए याद करने के लिए और आदेश या नियमित अभिव्यक्तियों का उपयोग कर आदेश।

+1

अच्छी तरह से किया गया। +1 –

+0

3 "दोनों नहीं बल्कि" आवश्यकता को पूरा नहीं करता है, लेकिन उस आवश्यकता को पूरा करना मुश्किल है। लाइन में कहीं और दिखाई देने से अन्य स्ट्रिंग को छोड़कर आपको ध्यान से तैयार किए गए उपसर्ग और प्रत्यय के विकल्प के प्रत्येक पक्ष की आवश्यकता होगी। –

+0

@ माइकल ई: 'लेकिन दोनों नहीं' बिट इटालिक्स में है और इसके बाद एक प्रश्न चिह्न है क्योंकि जब मैंने सवाल संपादित किया, तो मुझे यकीन नहीं था कि पूछताछ करने वाला क्या था। @ ग्राउंडहोग ने एक टिप्पणी/संशोधन के साथ प्रश्न को परिष्कृत/संशोधित करने से पहले अपने (अच्छे) उत्तर को लिखा था, जिसे शायद हटाया जाना चाहिए। –

3

ग्रेप -E --color "string1 | string2 | string3 ...."

खोजने के लिए उदाहरण के लिए है कि क्या हमारी प्रणाली एएमडी (SVM) या इंटेल (वीएमएक्स) प्रोसेसर और अगर यह 64 बिट है (एल एम का उपयोग कर) एल एम लंबे मोड- 64 बिट का मतलब है कि के लिए खड़ा है ...

आदेश उदाहरण:

ग्रेप -E --color "एल एम | SVM | वीएमएक्स"/proc/cpuinfo

-E को जरूरी है कई स्ट्रिंग्स खोजें