GNU के साथ grep
:
N=10; grep -roP ".{0,$N}foo.{0,$N}" .
स्पष्टीकरण:
-o
=> केवल वही प्रिंट करें जो आपने मिलान किया है
-P
=> पर्ल शैली के नियमित भावों का उपयोग करें
- रेगेक्स कहते हैं कि 0 से
$N
वर्णों का मिलान करें और उसके foo
बाद 0 से $N
वर्णों का।
यदि आपके पास GNU नहीं है grep
:
find . -type f -exec \
perl -nle '
BEGIN{$N=10}
print if s/^.*?(.{0,$N}foo.{0,$N}).*?$/$ARGV:$1/
' {} \;
स्पष्टीकरण:
चूंकि हम अब grep
जीएनयू होने पर भरोसा नहीं कर सकते हैं grep
, इसलिए हम find
पुनरावर्ती रूप से ( -r
जीएनयू की कार्रवाई grep
) फ़ाइलों की खोज करने के लिए उपयोग करते हैं । प्रत्येक फ़ाइल के लिए, हम पर्ल स्निपेट निष्पादित करते हैं।
पर्ल स्विच:
-n
फ़ाइल लाइन लाइन द्वारा पढ़ें
-l
प्रत्येक पंक्ति के अंत में नई लाइन निकालें और इसे प्रिंट करते समय वापस रखें
-e
निम्नलिखित स्ट्रिंग को कोड के रूप में समझें
पर्ल स्निपेट अनिवार्य रूप से एक ही काम कर रहा है grep
। यह आपके द्वारा $N
इच्छित संदर्भ वर्णों की संख्या के लिए एक चर सेट करके शुरू होता है । इसका BEGIN{}
मतलब यह है कि निष्पादन की शुरुआत में केवल एक बार निष्पादित किया जाता है, प्रत्येक फ़ाइल में प्रत्येक पंक्ति के लिए एक बार नहीं।
प्रत्येक लाइन के लिए निष्पादित स्टेटमेंट लाइन को प्रिंट करना है यदि रेगेक्स प्रतिस्थापन काम करता है।
रेगेक्स:
- किसी भी पुराने बात lazily का मिलान करें 1 लाइन के शुरू में (
^.*?
) के बाद .{0,$N}
के रूप में grep
मामला है, इसके बाद से foo
एक और के द्वारा पीछा किया .{0,$N}
और अंत में लाइन के अंत तक lazily किसी भी पुराने बात से मेल ( .*?$
)।
- हम इसका विकल्प देते हैं
$ARGV:$1
। $ARGV
एक जादुई चर है जो वर्तमान फ़ाइल का नाम पढ़ा जा रहा है। $1
इस मामले में संदर्भ: परेंस का मिलान क्या है।
- या तो अंत में आलसी मैचों की आवश्यकता होती है, क्योंकि एक लालची मैच के लिए
foo
असफल होने से पहले सभी पात्रों को खा जाएगा (चूंकि .{0,$N}
शून्य बार मिलान करने की अनुमति है)।
1 यानी, जब तक यह मैच पूरी तरह से विफल नहीं होगा, तब तक कुछ भी मैच न करना पसंद करें। संक्षेप में, संभव के रूप में कुछ वर्णों से मेल खाते हैं।