Grep

Grep

কঠিন

ভূমিকা

আপনি একটি স্থানীয় লাইব্রেরিতে চাকরি নিয়েছেন, সেখানকার পুরনো বইয়ের সংগ্রহ গুছিয়ে রাখতে সাহায্য করবেন। শিক্ষার্থী পাঠকেরা প্রায়ই তাদের টার্ম পেপারে উদ্ধৃতি দেওয়ার জন্য অর্ধেক-মনে-পড়া কোনো বাক্য খুঁজতে থাকে। প্রতিটি বই শুরু থেকে শেষ পর্যন্ত নিজে পড়ার বদলে, আপনি সেগুলো স্ক্যান করার জন্য একটি ছোট টুল বানানোর সিদ্ধান্ত নিলেন, যাতে ওই আংশিক উদ্ধৃতিগুলো খুঁজে পাওয়া যায়।

নির্দেশনা

একটি সার্চ স্ট্রিং-এর সাথে মেলে এমন লাইন ফাইলগুলোতে খুঁজুন এবং মেলে যাওয়া সব লাইন রিটার্ন করুন।

ইউনিক্সের grep কমান্ড রেগুলার এক্সপ্রেশনের সাথে মেলে এমন লাইন ফাইলগুলোতে খোঁজে। আপনার কাজ হলো একটি সরলীকৃত grep কমান্ড তৈরি করা, যা নির্দিষ্ট স্ট্রিং খোঁজার সুবিধা দেয়।

grep কমান্ড তিনটি আর্গুমেন্ট নেয়:

  1. যে স্ট্রিংটি খুঁজতে হবে।
  2. কমান্ডের আচরণ কাস্টমাইজ করার জন্য শূন্য বা তার বেশি ফ্ল্যাগ।
  3. যে এক বা একাধিক ফাইলে খুঁজতে হবে।

এরপর এটি নির্দিষ্ট করা ফাইলগুলোর বিষয়বস্তু (নির্দিষ্ট করা ক্রমে) পড়ে, যে লাইনগুলোতে সার্চ স্ট্রিং আছে সেগুলো খুঁজে বের করে, এবং সবশেষে যে ক্রমে লাইনগুলো পাওয়া গেছে সেই ক্রমে সেগুলো রিটার্ন করে। একাধিক ফাইলে খোঁজার সময়, প্রতিটি মেলে যাওয়া লাইনের শুরুতে ফাইলের নাম ও একটি কোলন (':') যোগ করা হয়।

ফ্ল্যাগ

grep কমান্ড নিচের ফ্ল্যাগগুলো সমর্থন করে:

  • -n আউটপুটের প্রতিটি লাইনের আগে লাইন নম্বর ও একটি কোলন (':') বসান, ফাইলের নাম থাকলে নম্বরটি তার পরে বসান।
  • -l শুধু সেই ফাইলগুলোর নাম আউটপুট করুন যেগুলোতে অন্তত একটি মেলে যাওয়া লাইন আছে।
  • -i কেস-ইনসেনসিটিভ তুলনা ব্যবহার করে মেলান।
  • -v প্রোগ্রামটি উল্টে দিন: যে লাইনগুলো মেলে না সেগুলো সংগ্রহ করুন।
  • -x শুধু সেই লাইনগুলো খুঁজুন যেখানে সার্চ স্ট্রিং পুরো লাইনের সাথে মেলে।

IO প্রক্রিয়া

অন্য অনুশীলনীগুলোর থেকে আলাদা, grep-এর জন্য "বাইরের জগৎ"-এর সঙ্গে আন্তঃক্রিয়া করা প্রয়োজন: ফাইল পড়া, সিস্টেম এরর সামলানো আর stdout-এ প্রিন্ট করা।

Lean-এ সিস্টেমের সঙ্গে আন্তঃক্রিয়া সাধারণত IO মোনাডে করা হয়, যা একটি সীমাবদ্ধ পরিবেশে সাইড এফেক্ট ঘটতে দেয়, আর তাতে অন্য বেশিরভাগ ফাংশনের বিশুদ্ধ অবস্থা অক্ষত থাকে।

আর্গুমেন্ট পড়া

Lean-এ একটি ফাইলকে স্ক্রিপ্ট হিসেবে চালানো যায়, হয় সরাসরি lean --run দিয়ে একটি স্বতন্ত্র স্ক্রিপ্ট হিসেবে, নয়তো lake ব্যবহার করে।

একটি Lean প্রজেক্টের প্রবেশবিন্দু একটিই, main নামের একটি ফাংশন, যা তার কাছে পাঠানো সব আর্গুমেন্টসহ একটি List String নেয়। এই অনুশীলনীতে Grep.lean-কে একটি এক্সিকিউটেবল হিসেবে চালানোর অনুকরণ করতে আর্গুমেন্ট একইভাবে পাঠানো হয়।

ফাইল পড়া

ফাইল নিয়ে কাজ করার জন্য Lean IO.FS মোনাডে ফাংশন দেয়। যেমন, একটি নির্দিষ্ট পাথে থাকা ফাইলের বিষয়বস্তু একটি String হিসেবে পড়তে IO.FS.readFile ব্যবহার করা যায়।

আউটপুট লেখা

মান রিটার্ন করার বদলে এই অনুশীলনীতে ফলাফল স্ট্যান্ডার্ড আউটপুট বা স্ট্যান্ডার্ড এররে লেখা প্রয়োজন। এ কাজের জন্য Lean-এ ফাংশন আছে।

সিস্টেম এরর সামলানো

Except-এর এররগুলোর থেকে আলাদা, IO-এর এক্সেপশনগুলো আসলে রানটাইম এক্সেপশন। এগুলো সামলাতে আপনি try/catch ব্যবহার করতে পারেন:

try
    /- 
        code that may possibly raise an exception 
    -/
catch msg =>
    /-
        code that is executed only if an exception was thrown
    -/
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Lean Exercism

Grep শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Lean ট্র্যাকের 100টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।