你在当地一家图书馆找了份工作,帮忙整理馆藏的旧书。常来的学生读者常常要翻找那些记不全的引文,好写进自己的学期论文里。与其一本一本地从头读到尾,你决定做一个小工具来扫描这些书,找出那些残缺的引文。
在文件中搜索与搜索字符串匹配的行,并返回所有匹配的行。
Unix 的grep命令会在文件中搜索匹配正则表达式的行。你的任务是实现一个简化版的grep命令,它支持搜索固定字符串。
grep命令接受三个参数:
然后它会按指定的顺序读取这些文件的内容,找出包含搜索字符串的行,最后按找到它们的顺序返回这些行。在多个文件中搜索时,每条匹配的行前面都会加上文件名和一个冒号(':')。
grep命令支持以下标志:
-n在输出的每一行前面加上行号和冒号(':'),并把行号放在文件名之后(如果有文件名的话)。-l只输出至少包含一条匹配行的文件名。-i使用不区分大小写的比较进行匹配。-v反转程序,即收集所有不匹配的行。-x只搜索搜索字符串与整行完全匹配的行。实现:
grep ( pattern flags files -- lines )pattern 是搜索字符串,flags 是由零个或多个标志字符串"-n"、"-l"、"-i"、"-v"和"-x"组成的数组,files 是由一个或多个文件名组成的数组。把匹配的行(连同所请求的文件名和行号前缀)以字符串数组的形式返回。
当指定了 -l 标志时,返回一个数组,其中包含至少有一行匹配的文件名。
使用file-lines读取一个文件的行,并传入一种编码:
USING: io.encodings.utf8 io.files ;
"iliad.txt" utf8 file-lines
! => { "Achilles sing, O Goddess! Peleus' son;" ... }
三个测试数据文件(iliad.txt、midsummer-night.txt和paradise-lost.txt)随练习一起放在工作目录中,所以直接按文件名读取即可。