شما در یک کتابخانهی محلی شغلی گرفتهاید و به سازماندهی مجموعهی کتابهای قدیمی آن کمک میکنید. مراجعان دانشجو اغلب دنبال نقلقولهایی میگردند که نیمهیادشان مانده تا در مقالههای ترمشان به آنها استناد کنند. بهجای اینکه همهی کتابها را دستی از جلد تا جلد بخوانید، تصمیم میگیرید ابزار کوچکی بسازید که آنها را بررسی کند و این نقلقولهای ناقص را پیدا کند.
فایلها را برای یافتن خطهایی که با یک رشتهی جستوجو مطابقت دارند جستوجو کنید و همهی خطهای مطابق را برگردانید.
فرمان grep در Unix فایلها را برای یافتن خطهایی که با یک عبارت باقاعده مطابقت دارند جستوجو میکند.
وظیفهی شما پیادهسازی یک فرمان سادهشدهی grep است که از جستوجوی رشتههای ثابت پشتیبانی میکند.
فرمان grep سه آرگومان میگیرد:
سپس محتوای فایلهای مشخصشده را (به همان ترتیبی که مشخص شدهاند) میخواند، خطهایی را که شامل رشتهی جستوجو هستند پیدا میکند و در پایان آن خطها را به همان ترتیبی که پیدا شدهاند برمیگرداند.
هنگام جستوجو در چند فایل، به ابتدای هر خط مطابق، اسم فایل و یک دونقطه (':') اضافه میشود.
فرمان grep از گزینههای زیر پشتیبانی میکند:
-n شمارهی خط و یک دونقطه (':') را به ابتدای هر خط در خروجی اضافه میکند و شماره را بعد از اسم فایل (در صورت وجود) قرار میدهد.-l فقط اسم فایلهایی را خروجی میدهد که دستکم یک خط مطابق دارند.-i مطابقت را با مقایسهای بدون توجه به بزرگی و کوچکی حروف انجام میدهد.-v برنامه را معکوس میکند: همهی خطهایی را که مطابقت ندارند جمع میکند.-x فقط خطهایی را جستوجو میکند که رشتهی جستوجو با کل خط مطابقت داشته باشد.Powershell از پارامترهای سوئیچ برای توابع پشتیبانی میکند که رفتاری مشابه «پرچمها» در خط فرمان دارند.
Powershell این رسم را دارد که برای cmdletها و ویژگیهایش نامهایی مفصل و پرجزئیات بگذارد؛ به همین دلیل، نام پرچمهای این تمرین هم تغییر کرده تا با زبان همخوانی داشته باشد.
Line (-n): شمارهی خط و یک دونقطه (:) را به ابتدای هر خط در خروجی اضافه میکند و شماره را بعد از نام فایل (در صورت وجود) قرار میدهد.File (-l): فقط نام فایلهایی را خروجی میدهد که دستکم یک خط منطبق داشته باشند.Insensitive (-i): تطبیق را با مقایسهای غیرحساس به بزرگی و کوچکی حروف انجام میدهد.Invert (-v): برنامه را برعکس میکند؛ همهی خطوطی را جمع میکند که تطبیق نمیکنند.Whole (-x): فقط خطوطی را جستوجو میکند که رشتهی جستوجو با تمام خط مطابقت کند.تمرکز اصلی شما باید روی پیادهسازی تابع grep باشد و لازم نیست نگران درست به دست آوردن مسیر فایلها باشید.
این تمرین ۳ فایل متنی موردنیاز را در test suite در اختیار شما میگذارد: iliad.txt، midsummer-night.txt و paradise-lost.txt. کافی است محتوای آنها را با Get-Content و با استفاده از رشتهی نام فایل، بهجای مسیر معمول فایل، بخوانید.
Powershell در واقع یک cmdlet مشابه grep دارد به نام Select-String، و اگر علاقهمند باشید میتوانید دربارهی آن اینجا بیشتر بخوانید.
در این تمرین به هیچ وجه نباید از Select-String استفاده کنید.
در Exercism ثبتنام کنید تا PowerShell را همراه با 136 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.