Grep

Grep

متوسط

مقدمة

لقد حصلت على وظيفة في مكتبة محلية تساعد في تنظيم مجموعتها من الكتب القديمة. وكثيرًا ما يبحث الطلاب الروّاد عن اقتباسات لا يتذكرونها إلا جزئيًا ليستشهدوا بها في أوراقهم الدراسية. وبدلًا من أن تقرأ كل كتاب يدويًا من الغلاف إلى الغلاف، تقرر بناء أداة صغيرة تفحص الكتب بحثًا عن هذه الاقتباسات الجزئية.

التعليمات

ابحث في الملفات عن الأسطر التي تطابق سلسلة نصية للبحث، ثم أرجع جميع الأسطر المطابقة.

يبحث أمر grep في Unix في الملفات عن الأسطر التي تطابق تعبيرًا نمطيًا. مهمتك هي تنفيذ أمر grep مبسّط يدعم البحث عن سلاسل نصية ثابتة.

يأخذ الأمر grep ثلاثة وسائط:

  1. السلسلة النصية للبحث.
  2. صفر أو أكثر من العلامات لتخصيص سلوك الأمر.
  3. ملف واحد أو أكثر للبحث فيه.

ثم يقرأ محتويات الملفات المحددة (بالترتيب المحدد)، ويجد الأسطر التي تحتوي على السلسلة النصية للبحث، وأخيرًا يُرجع تلك الأسطر بالترتيب الذي وُجدت به. عند البحث في عدة ملفات، يُسبق كل سطر مطابق باسم الملف والنقطتين الرأسيتين (':').

العلامات

يدعم الأمر grep العلامات التالية:

  • -n أضف رقم السطر والنقطتين الرأسيتين (':') في بداية كل سطر من الإخراج، مع وضع الرقم بعد اسم الملف (إن وُجد).
  • -l أخرج أسماء الملفات التي تحتوي على سطر مطابق واحد على الأقل فقط.
  • -i طابق باستخدام مقارنة غير حساسة لحالة الأحرف.
  • -v اعكس عمل البرنامج، واجمع كل الأسطر التي لا تطابق.
  • -x ابحث فقط عن الأسطر التي تطابق فيها السلسلة النصية للبحث السطر بأكمله.

معالجة الأخطاء

يقدّم هذا التمرين صندوق anyhow، الذي يسهّل التعامل مع أنواع الأخطاء الاعتباطية. الغرض منه هو أن يضمن أنه عند كتابتك تطبيقًا، لا داعي للقلق بشأن الأخطاء المعينة التي تُرجعها الدالة التي استدعيتها، بل فقط أن تفعل الصواب عند تمريرها.

ملاحظة: في الواقع، من غير المستحسن نوعًا ما استخدام anyhow عند كتابة مكتبة، كما نفعل هنا؛ فكتابة enum باسم Error خاصتك عند كتابة مكتبة أكثر وضوحًا وأكثر فائدة (وربما بمساعدة وحدات ماكرو مساعدة مثل تلك التي يوفرها صندوق thiserror). غير أننا نفعل ذلك هنا عن قصد وبشكل صريح لتوضيح استخدام هذا الصندوق.

لمعرفة المزيد عن هذا الصندوق، راجع توثيقه.

قراءة إضافية

بينما يطلب منك هذا التمرين تنفيذ أبسط دوال grep فقط، يوجد في الواقع مشروع لإعادة تنفيذ grep بالكامل بلغة Rust، وهو ripgrep.

إذا أعجبتك فكرة إعادة كتابة برامج الأدوات الأساسية بلغة Rust، فتأكد من الاطلاع على المشاريع التالية:

  • fd، نسخة طبق الأصل من find
  • exa، نسخة طبق الأصل من ls
  • bat، نسخة طبق الأصل من cat
  • coreutils، إعادة كتابة لأدوات GNU coreutils
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Rust Exercism

مستعد لبدء Grep؟

سجّل في Exercism لتتعلّم وتتقن Rust عبر 99 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.