मैं pcregrep पर बहुत अधिक निर्भर था, लेकिन नए grep के साथ आपको इसके कई विशेषताओं के लिए pcregrep को स्थापित करने की आवश्यकता नहीं है। बस उपयोग करें grep -P।
ओपी के प्रश्न के उदाहरण में, मुझे लगता है कि निम्नलिखित विकल्प अच्छी तरह से काम करते हैं, दूसरा सबसे अच्छा मिलान के साथ कि मैं प्रश्न को कैसे समझता हूं:
grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*
मैंने टेक्स्ट को / tmp / test1 के रूप में कॉपी किया और 'g' को हटा दिया और / tmp / test2 के रूप में सहेज लिया। यहाँ आउटपुट दिखा रहा है कि पहला मिलान स्ट्रिंग दिखाता है और दूसरा केवल फ़ाइल नाम दिखाता है (ठेठ -o मैच दिखाना है और ठेठ -l केवल फ़ाइल नाम दिखाना है)। ध्यान दें कि 'z' मल्टीलाइन के लिए आवश्यक है और '(। | \ N)' का अर्थ 'न्यूलाइन के अलावा' या 'न्यूलाइन' के अलावा किसी भी चीज़ से मेल खाता है - यानी कुछ भी:
user@host:~$ grep -Pzo "abc(.|\n)*efg" /tmp/tes*
/tmp/test1:abc blah
blah blah..
blah blah..
blah blah..
blah efg
user@host:~$ grep -Pzl "abc(.|\n)*efg" /tmp/tes*
/tmp/test1
यह निर्धारित करने के लिए कि आपका संस्करण पर्याप्त नया है, चलाएं man grepऔर देखें कि क्या ऐसा ही कुछ शीर्ष के पास दिखाई देता है:
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see
below). This is highly experimental and grep -P may warn of
unimplemented features.
वह GNU grep 2.10 से है।