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