Ми влаштувалися на роботу до місцевої бібліотеки, де допомагаємо впорядковувати колекцію старих книжок. Студенти, які приходять до бібліотеки, часто шукають цитати, які памʼятають лише наполовину, щоб процитувати їх у своїх курсових роботах. Замість того щоб вручну читати кожну книжку від першої до останньої сторінки, ми вирішуємо створити невеликий інструмент, який буде сканувати їх, шукаючи ці уривки цитат.
Знайти у файлах рядки, що містять рядок пошуку, і повернути всі знайдені рядки.
Команда Unix grep шукає у файлах рядки, що відповідають регулярному виразу.
Наше завдання - реалізувати спрощену команду grep, яка підтримує пошук фіксованих рядків тексту (англ. string).
Команда grep приймає три аргументи:
Далі вона читає вміст указаних файлів (у вказаному порядку), знаходить рядки, що містять рядок пошуку, і нарешті повертає ці рядки в порядку, у якому їх було знайдено. Під час пошуку в кількох файлах перед кожним знайденим рядком додається імʼя файлу та двокрапка (':').
Команда grep підтримує такі прапорці:
-n Додає номер рядка та двокрапку (':') перед кожним рядком у вихідних даних, розміщуючи номер після імені файлу (якщо воно є).-l Виводить лише імена файлів, які містять принаймні один знайдений рядок.-i Шукає з порівнянням без урахування регістру.-v Інвертує роботу програми: збирає всі рядки, що не відповідають умові пошуку.-x Шукає лише ті рядки, які повністю збігаються з рядком пошуку.Powershell підтримує параметри-перемикачі для функцій, які поводяться подібно до прапорців у командному рядку.
Дотримуючись звичаю Powershell давати командлетам і їхнім властивостям докладні та багатослівні назви, прапорці, які використовуються в цій вправі, теж отримали змінені назви, щоб відповідати мові.
Line (-n): Додавати номер рядка та двокрапку (':') на початок кожного рядка у вихідних даних, розміщуючи номер після назви файлу (якщо вона є).File (-l): Виводити лише назви файлів, які містять принаймні один рядок, що збігається.Insensitive (-i): Порівнювати без урахування регістру.Invert (-v): Інвертувати програму, тобто зібрати всі рядки, які не збігаються.Whole (-x): Шукати лише ті рядки, у яких пошуковий рядок тексту (англ. string) збігається з цілим рядком.Головне завдання - реалізувати функцію grep, а не перейматися тим, щоб правильно отримати шлях до файлів.
Ця вправа надає 3 обовʼязкові текстові файли: iliad.txt, midsummer-night.txt і paradise-lost.txt у тестовому наборі; достатньо отримати їхній вміст за допомогою Get-Content, використовуючи рядок тексту з назвою замість звичайного шляху до файлу.
У Powershell справді є командлет, подібний до grep, який називається Select-String; якщо цікаво, більше про нього можна прочитати тут.
У жодному разі не використовуйте Select-String у цій вправі.
Зареєструйтеся на Exercism, щоб вивчати й опановувати PowerShell, а також 136 вправ та справжнє наставництво від людей, і все це безкоштовно.