Grep

Grep

متوسط

مقدمه

شما در یک کتابخانه‌ی محلی شغلی گرفته‌اید و به سازماندهی مجموعه‌ی کتاب‌های قدیمی آن کمک می‌کنید. مراجعان دانشجو اغلب دنبال نقل‌قول‌هایی می‌گردند که نیمه‌یادشان مانده تا در مقاله‌های ترمشان به آن‌ها استناد کنند. به‌جای اینکه همه‌ی کتاب‌ها را دستی از جلد تا جلد بخوانید، تصمیم می‌گیرید ابزار کوچکی بسازید که آن‌ها را بررسی کند و این نقل‌قول‌های ناقص را پیدا کند.

دستورالعمل‌ها

فایل‌ها را برای یافتن خط‌هایی که با یک رشته‌ی جست‌وجو مطابقت دارند جست‌وجو کنید و همه‌ی خط‌های مطابق را برگردانید.

فرمان grep در Unix فایل‌ها را برای یافتن خط‌هایی که با یک عبارت باقاعده مطابقت دارند جست‌وجو می‌کند. وظیفه‌ی شما پیاده‌سازی یک فرمان ساده‌شده‌ی grep است که از جست‌وجوی رشته‌های ثابت پشتیبانی می‌کند.

فرمان grep سه آرگومان می‌گیرد:

  1. رشته‌ای که باید جست‌وجو شود.
  2. صفر یا چند گزینه برای سفارشی‌سازی رفتار فرمان.
  3. یک یا چند فایل برای جست‌وجو.

سپس محتوای فایل‌های مشخص‌شده را (به همان ترتیبی که مشخص شده‌اند) می‌خواند، خط‌هایی را که شامل رشته‌ی جست‌وجو هستند پیدا می‌کند و در پایان آن خط‌ها را به همان ترتیبی که پیدا شده‌اند برمی‌گرداند. هنگام جست‌وجو در چند فایل، به ابتدای هر خط مطابق، اسم فایل و یک دونقطه (':') اضافه می‌شود.

گزینه‌ها

فرمان grep از گزینه‌های زیر پشتیبانی می‌کند:

  • -n شماره‌ی خط و یک دونقطه (':') را به ابتدای هر خط در خروجی اضافه می‌کند و شماره را بعد از اسم فایل (در صورت وجود) قرار می‌دهد.
  • -l فقط اسم فایل‌هایی را خروجی می‌دهد که دست‌کم یک خط مطابق دارند.
  • -i مطابقت را با مقایسه‌ای بدون توجه به بزرگی و کوچکی حروف انجام می‌دهد.
  • -v برنامه را معکوس می‌کند: همه‌ی خط‌هایی را که مطابقت ندارند جمع می‌کند.
  • -x فقط خط‌هایی را جست‌وجو می‌کند که رشته‌ی جست‌وجو با کل خط مطابقت داشته باشد.

پروسه‌ی Node

برخلاف تمرین‌های دیگر، grep.js داخل فایل تست grep.spec.js ایمپورت نمی‌شود. در عوض، از آن مثل یک فایل اجرایی استفاده می‌شود. برای اینکه این کار ممکن شود، فایل grep.js با یک «shebang» و کامنتی که توضیح می‌دهد این خط چه کاری انجام می‌دهد آماده شده است:

#!/usr/bin/env node

// The above line is a shebang. On Unix-like operating systems, or environments,
// this will allow the script to be run by node, and thus turn this JavaScript
// file into an executable. In other words, to execute this file, you may run
// the following from your terminal:
//
// ./grep.js args
//
// If you do not have a Unix-like operating system or environment, for example
// Windows without WSL, you can use the following inside a window terminal,
// such as cmd.exe:
//
// node grep.js args
//
// Read more about shebangs here: https://en.wikipedia.org/wiki/Shebang_(Unix)

تست‌ها یک پروسه‌ی جدید Node را راه‌اندازی می‌کنند که grep.js را اجرا می‌کند.

خواندن آرگومان‌ها

برای به دست آوردن آرگومان‌هایی که پروسه با آن‌ها شروع شده است، از process.argv استفاده کنید.

خواندن فایل‌ها

تابع readLines در اختیار شما قرار گرفته است. برای استفاده از آن، نیازی به تغییر مسیر فایل نیست. تابع readlines مسیر را از روی پوشه‌ی کاری جاری مشخص می‌کند؛ این پوشه برای پروسه‌های grep.js روی پوشه‌ی تمرین تنظیم شده است.

نوشتن خروجی

برای نوشتن خروجی، از موارد زیر استفاده کنید:

  • console.log برای نوشتن در جریان خروجی استاندارد،
  • console.error برای نوشتن در جریان خطای استاندارد.

تست‌ها اجرا را در صورتی موفق (resolved) در نظر می‌گیرند که چیزی در جریان خطای استاندارد نوشته نشود و در صورتی ناموفق (rejected) که چیزی در جریان خطای استاندارد نوشته شود.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
JavaScript Exercism

آماده‌اید Grep را شروع کنید؟

در Exercism ثبت‌نام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.