आपने एक स्थानीय पुस्तकालय में नौकरी कर ली है, जहाँ आप पुरानी किताबों के संग्रह को व्यवस्थित करने में मदद करते हैं। छात्र पाठक अक्सर अपने टर्म पेपर में उद्धृत करने के लिए आधे-अधूरे याद रह गए उद्धरण ढूँढते रहते हैं। हर किताब को शुरू से अंत तक खुद पढ़ने के बजाय, आप एक छोटा टूल बनाने का फैसला करते हैं, जो उन किताबों को स्कैन करके इन अधूरे उद्धरणों को खोज निकाले।
फाइलों में ऐसी लाइनें खोजिए जो सर्च स्ट्रिंग से मेल खाती हों, और मेल खाने वाली सभी लाइनें लौटाइए।
Unix का grep कमांड फाइलों में ऐसी लाइनें खोजता है जो किसी रेगुलर एक्सप्रेशन से मेल खाती हों। आपको एक सरल grep कमांड बनाना है, जो तय स्ट्रिंग खोज सके।
grep कमांड तीन आर्गुमेंट लेता है:
इसके बाद यह दी गई फाइलों को उसी क्रम में पढ़ता है जिस क्रम में उनके नाम दिए गए हैं। फिर उन लाइनों को ढूँढ़ता है जिनमें सर्च स्ट्रिंग मौजूद हो, और अंत में उन लाइनों को उसी क्रम में लौटाता है जिस क्रम में वे मिली थीं। जब एक से अधिक फाइलों में खोजा जाता है, तो हर मेल खाने वाली लाइन के आगे उस फाइल का नाम और एक कोलन (':') लगा दिया जाता है।
grep कमांड निम्नलिखित फ्लैग का समर्थन करता है:
-n आउटपुट की हर लाइन के आगे उसकी संख्या और एक कोलन (':') जोड़िए, और संख्या को फाइल के नाम के बाद रखिए (अगर नाम मौजूद हो)।-l केवल उन फाइलों के नाम प्रदर्शित कीजिए जिनमें कम से कम एक मेल खाने वाली लाइन हो।-i छोटे-बड़े अक्षरों में अंतर किए बिना मिलान कीजिए।-v प्रोग्राम का व्यवहार उलट दीजिए, यानी उन सभी लाइनों को इकट्ठा कीजिए जो मेल नहीं खातीं।-x केवल उन्हीं लाइनों को खोजिए जिनमें सर्च स्ट्रिंग पूरी लाइन से मेल खाती हो।Powershell फंक्शन के लिए स्विच पैरामीटर का समर्थन करता है, जो कमांड लाइन के फ्लैग की तरह काम करते हैं।
Powershell में कमांडलेट और उसकी प्रॉपर्टी के नाम विस्तृत और लंबे रखने की परंपरा है। इसी परंपरा को ध्यान में रखते हुए, इस अभ्यास में इस्तेमाल होने वाले फ्लैग के नाम भी भाषा के हिसाब से बदल दिए गए हैं।
Line (-n): आउटपुट की हर लाइन के आगे उसका लाइन नंबर और एक कोलन (':') जोड़िए, और नंबर को फाइल नाम के बाद रखिए (अगर फाइल नाम मौजूद हो)।File (-l): सिर्फ उन फाइलों के नाम दिखाइए जिनमें कम से कम एक लाइन मैच करती है।Insensitive (-i): ऐसी तुलना कीजिए जिसमें बड़े और छोटे अक्षरों का फर्क न पड़े।Invert (-v): प्रोग्राम का व्यवहार उलट दीजिए, यानी वे सारी लाइनें इकट्ठा कीजिए जो मैच नहीं करतीं।Whole (-x): सिर्फ उन लाइनों को खोजिए जिनमें खोजी जा रही स्ट्रिंग पूरी लाइन से मैच करती है।आपका मुख्य ध्यान grep फंक्शन बनाने पर होना चाहिए, फाइलों तक का सही पाथ पाने की चिंता आपको नहीं करनी है।
इस अभ्यास का टेस्ट सूट 3 ज़रूरी टेक्स्ट फाइलें देता है: iliad.txt, midsummer-night.txt, और paradise-lost.txt। इनका कंटेंट पाने के लिए आप आम फाइल पाथ की जगह सिर्फ नाम की स्ट्रिंग Get-Content को दे सकते हैं।
Powershell में grep जैसा एक कमांडलेट तो है ही, जिसका नाम Select-String है। अगर आपकी दिलचस्पी हो, तो आप इसके बारे में यहाँ और पढ़ सकते हैं।
इस अभ्यास में आपको किसी भी हालत में Select-String इस्तेमाल नहीं करना चाहिए।
Exercism पर साइन अप कीजिए और PowerShell को 136 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।