# 練習 48:`ed`
> 原文:[Exercise 48: ed](https://learncodethehardway.org/more-python-book/ex48.html)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
如果你的流程生效了,那么你應該能夠專注于較長的項目,一次幾個星期。在這個項目中,你的目標是創建盡可能精確的`ed`命令副本。這個練習的目標是不要有創意,而是要系統地實現另一個軟件的精確副本。將其看作一個偽造的練習。你會做出一些非常好的東西,你可以用它代替原來的`ed`,沒有人會知道。
這項工作是創建`ed`命令的“代碼大師副本”,盡可能準確,也就是說,你的測試套件應該對真正的`ed`和你的版本運行同一腳本,來比較輸出。這就像你在學習算法時所做的“代碼大師副本”練習,除了你復制現有軟件的行為,而不是試圖記住它。這個流程是相似的,但你可以使用測試套件幫助它更快地進行。
## 挑戰練習
`ed`工具,是現存的最早的 Unix 文本編輯器之一,坦率地說,它非常糟糕。實際上我無法想像有人使用`ed`編輯文本,因為它是目前最受用戶討厭的軟件之一。如果你無法想象,在 Unix 的黑暗時期,有多少計算機出了故障,制作一個`ed`的副本會讓你見識一下。
`ed`的一些概念是,雖然它支持腳本,但它最初是以交互方式使用的。就像用于文本文件的 MUD。你首先運行`ed`,它以命令模式啟動,讓你可以使用命令修改文本。當你執行需要輸入的命令時,它將進入輸入模式,直到該命令結束。你也必須知道行的地址來編輯它。這似乎是一種痛苦,但與其他文字編輯器相比,這是獨角獸的魔法。
為了完成你的`ed`副本,你需要嚴重依賴于 [Python 的`re`庫](https://docs.python.org/2/library/re.html),來使用正則表達式。我們在練習 31 中使用了這個庫,所以通常你應該熟悉它和 RegEx。
我還建議你,在 45 分鐘的會話內,嘗試使用`ed`,來你的`ed`項目編寫一些代碼。這樣做的痛苦將會教你如何復制它。
除此之外,你將需要閱讀`man ed`頁面來獲取命令的基礎知識,并可能會觀看它的使用教程。一個很好的起步就是,在線尋找不同的示例腳本,并嘗試將它們作為你的第一個測試用例。
> 注
> 我會給你一個線索,你需要使用 FSM 來處理`ed`命令的模態本質。
## 研究性學習
+ 查找 GNU `ed`的源代碼,即使你不懂得 C 語言,也看一看它。
+ 將你的`ed`實現變成一個模塊,然后可以在其他項目中使用。你需要將其用于以后的練習。
+ 永遠不要再做這樣的軟件,除非你就是無聊了。
- 笨辦法學 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