# 練習 49:`sed`
> 原文:[Exercise 49: sed](https://learncodethehardway.org/more-python-book/ex49.html)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
當你學習如何制作快速而簡陋的黑魔法時,你在練習 9 中實現了一個“低配版”的`sed`。在本練習中,您將嘗試實現另一個精確的命令副本。在練習 48 的研究性學習中,您的任務是從您的`ed`實現中創建一個模塊。如果你沒有這樣做,那么你需要為`sed`命令實現它,并且讓`sed`使用它。
你的流程怎么樣?你是否發現它在這些更長的項目上給了你幫助?有沒有你認為需要改變的東西?你是否收集了指標,還是覺得你現在已經渡過了那個階段?花點時間開始這個練習,看看你的日志,看看自從你開始讀這本書以來,你已經改進了多少。
這個練習的挑戰是,從練習 48 中的`ed`項目中獲取代碼,并在該項目中復用它。“可復用性”的概念對于軟件的工作方式至關重要,但是很多時候,在項目中復用的計劃會導致災難。人們經常設計軟件,以便每個組件可以在其他軟件中使用,但是在這樣做時,它們只是使設計過于復雜,并沒有真正計劃在任何其他項目中使用任何東西。最好使軟件是離散的、獨立的,然后取出可以用的一部分,在啟動另一個項目時使用它。
我通常編寫我的軟件,不會擔心可復用性。我不在乎項目的部分是否將用于其他項目。我只關心這一部分軟件工作良好,并且質量高。當我啟動一個新的項目,我會去看看我寫的其他東西,看看有什么我可以再次使用的東西。如果我花時間在較舊的項目中拉出我可以使用的模塊。這使我的復用流程看起來像這樣:
+ 通過自動化測試,實現功能完整的高質量軟件。不要在乎用于其他軟件的任何其它部分。
+ 啟動一個新項目,它可能使用另一個項目的代碼。
+ 回到第一個項目,將代碼放入一個單獨的模塊,使這個第一個項目使用它,并且絕對不更改任何其它東西。
+ 在適當的地方使用這個模塊,一旦在原始的項目中,我的原始自動化測試運行良好,我就在新項目中使用該模塊。
+ 最后,嘗試在新項目中使用新模塊,會發現我需要在模塊中進行的更改。我將進行更改,并確保它們與原始軟件配合良好。
沒有自動化測試的情況下,你不能做到它,所以如果你的`ed`項目沒有測試,我想知道是否你讀了這本書。回去,并確保你的測試完全覆蓋了`ed`項目。
## 挑戰練習
首先你要拉取`ed`項目的一部分,它處理命令,并把它放入`ed`所使用的模塊中,而不會破壞測試。實話說,這將成為這個項目最難的部分之一,因為`sed`大多只是使用它們,而沒有`ed`的交互界面的模態本質。
接下來,您將要從練習 9 中獲取舊的代碼,并重新啟用它,或者在這個新項目上從零開始。一旦你確定了,你將開始使用ed模塊實現盡可能多的sed。這項工作的創造力在于,確定兩個項目需要使用什么,然后將其放在模塊中。
這個實現中,你的目標是,制作一個`sed`命令的精確副本。這部分練習中沒有創造力。只要試著盡可能小心,并使用自動化測試來確認,您的命令和原始的`sed`的工作方式是一樣的。
最后,當您處理`sed`時,您將在模塊中找到所需的東西。您需要對模塊進行更改,使其在`sed`中工作,然后返回到`ed`并使其在那里工作。這三個項目之間的彈跳流程將是一個挑戰,所以我建議你保持你的 45 分鐘的時間塊,所以你不會被上下文切換搞暈。
## 研究性學習
當你處理模塊時,你是否發現了任何編程習慣,使拉取代碼變得困難?它們是什么?
- 笨辦法學 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