# 练习 7:`grep`
> 原文:[Exercise 7: grep](https://learncodethehardway.org/more-python-book/ex7.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
`find`命令在 45 分钟内应该可能是一个挑战,但它是一个很好的挑战。到了这个时间,你应该可以去掉尽可能多的,阻止你开始的障碍。你可能会发现,当你清除一些障碍时,你的技能会变得更糟。例如,我以前在开始工作之前先走路去喝咖啡。这花了我大约 30分钟,非常好,但 30 分钟多了会变成几个小时。我决定停止这样做,但是我的工作就费劲了。原来我还需要咖啡,所以我买了一台不错的咖啡机,学会了如何制作我自己的拿铁咖啡。现在我站了起来,给自己做一杯拿铁咖啡,然后去画一些画,这让我处于创意工作的模式。
你所做的一切不都是无效的,所以要小心不要因为占用时间而消除一些东西。有一些仪式和个人习惯,可以让你的大脑准备就绪。诀窍是不要消除这些,而是让它们在开始工作之前更容易做。
本书的第一部分中,您还应该了解时间管理的概念。设置45分钟的时间限制将使您非常清楚,当您不知道需要多久做某件事的时候。只有45分钟,你不能把 30 分钟浪费在调整你的 vim 窗口上,或者组织完美的目录结构,然后实现一个全新的排序算法。你必须节约你所实现的东西,以及命令你工作的东西。
处理项目的一个很好的方法是从最简单的事情开始,你可以首先配置并运行它。在`find`示例中,可以通过`glob`模块获取文件。具有较差时间管理技能的人,会立即尝试实现`-exec`参数,来证明它们是一个 NB 的程序员,但是`-exec`不能在没有-name的情况下工作,而且更难实现。决定的方法是告诉自己,你想要一些完成后才能使用的东西。如果45分钟之后,你可以使用`-exec`,但不能获取文件,那么你如何使用它?如果同一时间之后,你得到了一种方法,来列出匹配名称的文件,那么你已经完成了。
继续处理您的障碍列表,并评估您的开始怎么样,但现在开始看看时间管理。策略化你将要做的工作,以便如果你用完了时间,你做出来了一些可以用的东西。他们不必是完整的功能,但是两个可用的功能比 10 个不可用的更好,因为你忘记了他们所需要的最简单的东西。或者更糟的是 10 个不可用的东西,因为你实现了一半,然后就跳过去了,所以所有这些都不能用。
## 挑战练习
你现在要实现`grep`命令了。像往常一样,你应该去读的`grep`的`man`,然后玩转它。`grep`的目的是使用正则表达式在文件中搜索文本模式。你使用`glob`模块实现了`find`,这次的操作也一样,但在文件中而不是在目录中完成。例如,如果我想在我的书中搜索“help”这个词,我可以这样做:
```
grep help *.rst
```
`grep`的命令行参数相当简单。困难的部分是处理正则表达式,所以你应该依赖于`re`模块。该模块使您能够加载文件的内容,然后在里面搜索别人在命令行中提供给您的模式串。另一个提示是,您最有可能希望使用`readline`加载整个文件,而不是使用`read`。即使效率较低,`grep`的大部分选项都能更好地运行。
您可能还打算简单浏览练习 30,我在那里介绍正则表达式。
## 研究性学习
+ `re`模块有什么特别的选项,使它更像`grep`吗?
+ 您可以将您的`grep`黑魔法转换成您在`find`工具中使用的模块,来添加`grep`功能吗?
## 深入学习
`re`模块是非常重要的,所以花时间去真正研究它,并且学习你能学到的任何事情。我们将在本书的另一部分中使用它以及正则表达式。
- 笨办法学 Python · 续 中文版
- 引言
- 第一部分:预备知识
- 练习 0:起步
- 练习 1:流程
- 练习 2:创造力
- 练习 3:质量
- 第二部分:简单的黑魔法
- 练习 4:处理命令行参数
- 练习 5:cat
- 练习 6:find
- 练习 7:grep
- 练习 8:cut
- 练习 9:sed
- 练习 10:sort
- 练习 11:uniq
- 练习 12:复习
- 第三部分:数据结构
- 练习 13:单链表
- 练习 14:双链表
- 练习 15:栈和队列
- 练习 16:冒泡、快速和归并排序
- 练习 17:字典
- 练习 18:性能测量
- 练习 19:改善性能
- 练习 20:二叉搜索树
- 练习 21:二分搜索
- 练习 22:后缀数组
- 练习 23:三叉搜索树
- 练习 24:URL 快速路由
- 第四部分:进阶项目
- 练习 25:xargs
- 练习 26:hexdump
- 练习 27:tr
- 练习 28:sh
- 练习 29:diff和patch
- 第五部分:文本解析
- 练习 30:有限状态机
- 练习 31:正则表达式
- 练习 32:扫描器
- 练习 33:解析器
- 练习 34:分析器
- 练习 35:解释器
- 练习 36:简单的计算器
- 练习 37:小型 BASIC
- 第六部分:SQL 和对象关系映射
- 练习 38:SQL 简介
- 练习 39:SQL 创建
- 练习 40:SQL 读取
- 练习 41:SQL 更新
- 练习 42:SQL 删除
- 练习 43:SQL 管理
- 练习 44:使用 Python 的数据库 API
- 练习 45:创建 ORM
- 第七部分:大作业
- 练习 46:blog
- 练习 47:bc
- 练习 48:ed
- 练习 49:sed
- 练习 50:vi
- 练习 51:lessweb
- 练习 52:moreweb