地元の図書館で、古い本のコレクションの整理を手伝う仕事に就きました。学生の利用者は、学期末レポートに引用したい、うろ覚えの一節を探していることがよくあります。1冊ずつ最初から最後まで手作業で読む代わりに、それらの本をスキャンして、そうしたうろ覚えの一節を探す小さなツールを作ることにしました。
ファイルから検索文字列に一致する行を探し、一致したすべての行を返します。
Unixのgrepコマンドは、正規表現に一致する行をファイルから探します。
ここでの課題は、固定文字列の検索に対応した簡略版のgrepコマンドを実装することです。
grepコマンドは3つの引数を取ります。
次に、指定されたファイルの内容を(指定された順に)読み込み、検索文字列を含む行を探し、最後に見つかった順にそれらの行を返します。
複数のファイルを検索する場合、一致した各行の先頭にはファイル名とコロン(:)が付きます。
grepコマンドは次のフラグに対応しています。
-n 出力の各行の先頭に行番号とコロン(:)を付けます。行番号はファイル名の後ろに置きます(ファイル名がある場合)。-l 一致する行を1つ以上含むファイルの名前だけを出力します。-i 大文字と小文字を区別せずに比較して照合します。-v プログラムの動作を反転させ、一致しなかったすべての行を集めます。-x 検索文字列が行全体と一致する行だけを探します。ほかの演習とは違い、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)と見なします。
Exercismに登録すれば、37個のコンセプト159個の演習、そして本物の人間によるメンタリングとともに、JavaScriptを学んでマスターできます。すべて無料です。