sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的東西存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。以下介紹的是Gnu版本的Sed3.02。
歷史沿革
sed是為命令行處理數據文件而構建的早期unix命令之一,首次出現在Version 7 Unix中。它是貝爾實驗室的李·E·麥克馬洪于1973年至1974年開發的,基于交互式編輯器ed(“editor”,1971)和早期qed(“quick editor”,1965-66)的腳本功能。sed是最早支持正則表達式的工具之一,至今仍然用于文本處理,特別是用于替換命令。sed的語法,特別是把/用于模式匹配,把s///用于替換,起源于sed的前身ed(當時ed很常用)而且正則表達式語法影響了其他一些語言,特別是ECMAScript和Perl。GNU sed添加了一些新功能,包括文件的就地編輯。Super-sed 是sed的擴展版本,包含與Perl兼容的正則表達式。sed的另一變體minised,最初由埃里克·雷蒙通過逆向工程寫成,目前由René Rebe維護。在GNU計劃基于新的GNU正則表達式庫編寫了新版本的sed之前,GNU計劃一直使用minised。當前minised包含一些BSD sed的擴展,但不像GNU sed那樣功能豐富。它的優點是速度快,占用的內存少。它用于嵌入式系統,是MINIX提供的sed版本。
軟件介紹
sed是stream editor的縮寫。是一個非交互式上下文(context)編輯器,它被設計在下列三種情況下發揮作用:
編輯那些對舒適的交互式編輯而言太大的文件。
在編輯命令太復雜而難于在交互模式下鍵入的時候編輯任何大小的文件。
要在對輸入的一趟掃描中有效的進行多個‘全局’(global)編輯函數。
因為每次只把輸入的某些行駐留在內存中,并且不使用臨時文件,所以可編輯的文件的有效大小,只受限于輸入和輸出要同時共存于次級存儲的要求。
可以單獨的建立復雜的編輯腳本并作為給 sed 的命令文件。對于復雜的編輯,這節省了可觀的鍵入和隨之而來的錯誤。從命令文件運行 sed 高效于作者所知道的任何交互式編輯器,甚至包括能用預先寫好的腳本驅動的編輯器。
相較于交互式編輯器而言,根本性的損失是缺乏相對地址(由于操作是每次一行的),和缺乏對命令如期運行的立即驗證。
sed 是 UNⅨ編輯器ed 的直系后代。由于在交互式和非交互式操作之間的差異,在 ed 和 sed 之間已經有了可觀的變化;甚至 ed 的慣常用戶都會經常感到驚訝(并可能氣憤),如果他們沒有閱讀本文檔的章節 2 和 3,就草率的使用 sed 的話。在兩個編輯器之間最顯著的家族性共同之處,在于他們所識別的模式(‘正則表達式’)的種類;匹配模式的代碼可以從 ed 的代碼幾乎原封不動的復制過來,在章節 2 中對正則表達式的描述就是從 UNⅨ Programmer’s Manual 幾乎原封不動的復制過來的。
sed是一個面向行的文本處理實用程序:它從輸入流或文件中逐行讀取文本到一個稱為模式空間的內部緩沖區。每讀一行開始一個循環。對于模式空間,sed會應用sed腳本指定的一個或多個操作。sed實現了一種編程語言,其中包含大約25個指定文本操作的命令。對于每個輸入行,在運行腳本之后,sed通常輸出模式空間(由腳本修改的行),然后從下一行再次開始循環。其他腳本結束行為可通過sed選項和腳本命令獲得,例如d刪除模式空間,q退出,N立即將下一行添加到模式空間,等等。因此,sed腳本對應于循環體,循環體遍歷流的行,其中循環本身和循環變量(當前型號)是隱式的并由sed維護。
主要功能
定址
可以通過定址來定位你所希望編輯的行,該地址用數字構成,用逗號分隔的兩個行數表示以這兩行為起止的行的范圍(包括行數表示的那兩行)。如1,3表示1,2,3行,美元符號($)表示最后一行。范圍可以通過數據,正則表達式或者二者結合的方式確定。
用法和示例
sed的命令可以在命令行上指定(-e選項),也可以從單獨的文件中讀取(-f選項)。sed腳本中的命令可以采用行號或正則表達式作為地址。該地址確定決定命令何時運行。例如,2d將僅在第二個輸入行上運行d(刪除)命令(打印除第二個輸入行之外的所有行),而/^ /d將刪除以空格開頭的所有行。一些單獨的特殊緩沖區,即保持空間,可以由幾個sed命令使用,用于在循環之間保持和累積文本。sed的命令語言只有兩個變量(“保持空間”和“模式空間”)和類似GOTO的分支功能;然而,這種語言是圖靈完備的,用深奧sed腳本甚至寫得出推箱子、打磚塊、國際象棋和趣味俄羅斯方塊等游戲。
sed通常用作管道中的過濾器,例如:
generateData | sed 's/x/y/g'
這意味著,諸如“generateData”之類的程序生成數據,然后用sed把x替換成y。例如:
$ echo xyz xyz | sed 's/x/y/g'
yyz yyz
將幾個sed命令(每行一個命令)放入腳本文件(例如subst.sed)中然后使用-f選項從文件中運行命令(例如s/x/y/g)通常很有用:
sed -f subst.sed inputFileName > outputFileName
可以在腳本文件中放置任意數量的命令,使用腳本文件也可以避免shell轉義或替換的問題。
參考資料 >