你在当地一家图书馆找了份工作,帮忙整理馆藏的旧书。常来的学生读者常常要翻找那些记不全的引文,好写进自己的学期论文里。与其一本一本地从头读到尾,你决定做一个小工具来扫描这些书,找出那些残缺的引文。
在文件中搜索与搜索字符串匹配的行,并返回所有匹配的行。
Unix 的grep命令会在文件中搜索匹配正则表达式的行。你的任务是实现一个简化版的grep命令,它支持搜索固定字符串。
grep命令接受三个参数:
然后它会按指定的顺序读取这些文件的内容,找出包含搜索字符串的行,最后按找到它们的顺序返回这些行。在多个文件中搜索时,每条匹配的行前面都会加上文件名和一个冒号(':')。
grep命令支持以下标志:
-n在输出的每一行前面加上行号和冒号(':'),并把行号放在文件名之后(如果有文件名的话)。-l只输出至少包含一条匹配行的文件名。-i使用不区分大小写的比较进行匹配。-v反转程序,即收集所有不匹配的行。-x只搜索搜索字符串与整行完全匹配的行。PowerShell 的函数支持 switch 形参,其行为类似命令行中的标志。
遵循 PowerShell 为 cmdlet 及其属性取详细、冗长名称的习惯,本练习使用的标志也改了名字,以贴合这门语言的风格。
Line(-n):在输出的每一行前面加上行号和一个冒号(:),并把行号放在文件名之后(如果存在的话)。File(-l):只输出至少包含一行匹配内容的文件名。Insensitive(-i):使用不区分大小写的比较来匹配。Invert(-v):反转程序的行为,收集所有不匹配的行。Whole(-x):只查找搜索字符串与整行完全匹配的行。你的重点应该是实现 grep 函数,不必操心如何正确获取文件路径。
本练习会在测试套件中提供 3 个必需的文本文件:iliad.txt、midsummer-night.txt和paradise-lost.txt。你只需用Get-Content加上文件名的字符串即可访问它们的内容,而无需使用通常的文件路径。
PowerShell 确实有一个类似grep的 cmdlet,叫做Select-String。如果你感兴趣,可以在这里了解更多。
在本练习中,任何情况下都不要使用Select-String。