本教程我們來講講Unix下的一個非交互式的流編輯器sed介紹,主要包括sed是什么,sed工作機制等Unix sed理論知識,下一篇我們來講實用.
已經看了一段時間的Linux Shell編程了,也能完成一些基本的使用,為了加深理解,恰好看到了The Unix School的一個sed&awk教程,不是簡單的命令參數堆積,而是一個相當實用的系列,因此,希望能在幾天內完成翻譯.翻譯過程不會逐字翻譯,會穿插一些注釋,包括自己的一些理解和其他的一些引用,作為開篇,簡單說一下sed的工作機制,對后面的理解會有很大幫助.
sed是什么:
sed是一個非交互式的流編輯器(stream editor),所謂非交互式,是指使用sed只能在命令行下輸入編輯命令來編輯文本,然后在屏幕上查看輸出,而所謂流編輯器,是指sed每次只從文件(或輸入)讀入一行,然后對該行進行指定的處理,并將結果輸出到屏幕(除非取消了屏幕輸出又沒有顯式地使用打印命令),接著讀入下一行,整個文件像流水一樣被逐行處理然后逐行輸出(via Walk in Mindfields).
sed工作機制:
sed維護兩個緩沖區,pattern space和hold space,命令開始執行之前都為空.
pattern space緩沖區用于臨時保存每次讀取的一行的內容,大部分的匹配和替換等等操作都是針對pattern space中的內容進行的,因此不會對輸入文件有任何影響,而hold space則作為后備緩沖區使用,除非指定了一些特殊的命令(例如D刪除命令),否則pattern space中的內容會在處理完一行之后清空,但hold space中的內容在處理完每一行時不會被刪除.
也就是說pattern space相當于我們的內存,hold space相當于硬盤,處理的時候在內存里,處理過的就放回硬盤,這是我的理解,有一點點不恰當,但是因此一些概念會比較好理解.
具體來說,可以大致分為以下幾步.
1.首先,從標準輸入流讀取一行,移除換行符,然后存入pattern space中.
2.執行指定的命令,每個命令都有一個可選的地址,可以是行號,也可能是一個正則表達式匹配,這個地址作為一個執行命令前的測試,指定了需要對那些行進行操作,當前行只有匹配的情況下才會執行命令.
3.當指定所有的命令都執行完了之后,pattern space內容就被處理過了,sed默認會將pattern space中的內容打印到標準輸出中,移除的換行符也會打印出來,本行操作完成.
4.然后sed會讀取下一行的內容,再次執行相同的操作,直到行尾.
基本上最基礎的理論就差不多了,主要是這個工作機制比較重要,后面從示例中慢慢加深理解.
新聞熱點
疑難解答