你在当地一家图书馆找了份工作,帮忙整理馆藏的旧书。常来的学生读者常常要翻找那些记不全的引文,好写进自己的学期论文里。与其一本一本地从头读到尾,你决定做一个小工具来扫描这些书,找出那些残缺的引文。
在文件中搜索与搜索字符串匹配的行,并返回所有匹配的行。
Unix 的grep命令会在文件中搜索匹配正则表达式的行。你的任务是实现一个简化版的grep命令,它支持搜索固定字符串。
grep命令接受三个参数:
然后它会按指定的顺序读取这些文件的内容,找出包含搜索字符串的行,最后按找到它们的顺序返回这些行。在多个文件中搜索时,每条匹配的行前面都会加上文件名和一个冒号(':')。
grep命令支持以下标志:
-n在输出的每一行前面加上行号和冒号(':'),并把行号放在文件名之后(如果有文件名的话)。-l只输出至少包含一条匹配行的文件名。-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)。