Ми влаштувалися на роботу до місцевої бібліотеки, де допомагаємо впорядковувати колекцію старих книжок. Студенти, які приходять до бібліотеки, часто шукають цитати, які памʼятають лише наполовину, щоб процитувати їх у своїх курсових роботах. Замість того щоб вручну читати кожну книжку від першої до останньої сторінки, ми вирішуємо створити невеликий інструмент, який буде сканувати їх, шукаючи ці уривки цитат.
Знайти у файлах рядки, що містять рядок пошуку, і повернути всі знайдені рядки.
Команда Unix grep шукає у файлах рядки, що відповідають регулярному виразу.
Наше завдання - реалізувати спрощену команду grep, яка підтримує пошук фіксованих рядків тексту (англ. string).
Команда grep приймає три аргументи:
Далі вона читає вміст указаних файлів (у вказаному порядку), знаходить рядки, що містять рядок пошуку, і нарешті повертає ці рядки в порядку, у якому їх було знайдено. Під час пошуку в кількох файлах перед кожним знайденим рядком додається імʼя файлу та двокрапка (':').
Команда grep підтримує такі прапорці:
-n Додає номер рядка та двокрапку (':') перед кожним рядком у вихідних даних, розміщуючи номер після імені файлу (якщо воно є).-l Виводить лише імена файлів, які містять принаймні один знайдений рядок.-i Шукає з порівнянням без урахування регістру.-v Інвертує роботу програми: збирає всі рядки, що не відповідають умові пошуку.-x Шукає лише ті рядки, які повністю збігаються з рядком пошуку.На відміну від інших вправ, grep.js не імпортується всередині тестового файлу grep.spec.js. Натомість його використовуватимуть так, ніби це виконуваний файл. Щоб це стало можливим, файл grep.js уже містить шебанг і коментар, який пояснює, що це таке:
#!/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), якщо в стандартний потік помилок щось записано.
Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.