Sed

sed是一個使用簡單緊湊的程式語言來解析和轉換文字Unix實用程式。sed由貝爾實驗室的李·E·麥克馬洪於1973年至1974年開發，並且現在大多數作業系統都可以使用。 sed基於互動式編輯器ed的指令碼功能。sed是最早支援正則表示式的工具之一，至今仍然用於文字處理，特別是用於替換命令。用於純文字字串操作和“流編輯”的常用工具還有AWK和Perl 。歷史.sed是為命令列處理資料檔案而構建的早期Unix命令之一，首次出現在Version 7 Unix中 。它很自然地演變成為流行的grep命令的後繼。 最初的動機與grep 而且正則表示式語法影響了其他一些語言，特別是ECMAScript和Perl。後來，更強大的語言AWK問世，這些工具相互補充，讓透過shell指令碼完成強大的文字處理成為可能。sed和AWK常被認為Perl的祖先和靈感並且影響了Perl的語法和語義，尤其影響了匹配和替換運算子。GNU sed添加了一些新功能，包括檔案的就地編輯 。"Super-sed" 是sed的擴充套件版本，包含與Perl相容的正則表示式。sed的另一變體"minised" ，最初埃裡克·雷蒙把4.1BSD sed透過逆向工程寫成，目前由René Rebe維護。在GNU計劃基於新的GNU正則表示式庫編寫了新版本的sed之前，GNU計劃一直使用minised。當前minised包含一些BSD sed的擴充套件，但不像GNU sed那樣功能豐富。它的優點是速度快，佔用的記憶體少。它用於嵌入式系統，是Minix提供的sed版本。工作模式.sed是一個面向行的文字處理實用程式：它從輸入流或檔案中逐行讀取文字到一個稱為"模式空間" 的內部緩衝區。每讀一行開始一個"迴圈" 。對於模式空間，sed會應用"sed指令碼" 指定的一個或多個操作。sed實現了一種程式語言，其中包含大約25個指定文字操作的"命令" 。對於每個輸入行，在執行指令碼之後，sed通常輸出模式空間是隱式的並由sed維護。可以在命令列上指定sed指令碼和類似GOTO的分支功能；然而，這種語言是圖靈完備的， 用深奧sed指令碼甚至寫得出推箱子、打磚塊、國際象棋和俄羅斯方塊等遊戲。為輸入流的每一行執行一次主迴圈，在輸入的每一行上計算sed指令碼。sed指令碼的每一行都是模式-動作對，指示著要匹配的模式和要執行的操作，可以將其重新組合為條件語句。因為主迴圈、工作變數是隱式的，所以可以編寫簡潔的單行程式。例如，以下sed程式：10q將列印輸入的前10行，然後停止。用法.替換命令.下面的示例顯示了sed用於替換的典型用法。這種用法確實是sed的最初動機：sed 's/regexp/replacement/g' inputFileName &gt; outputFileName在某些版本的sed中，表示式的前面必須加上codice_6，以表示後面跟著一個表示式。codice_12表示替換，而codice_13表示全域性，這意味著行中的所有匹配項都將被替換。要搜尋的正則表示式是傳統的符號，起源於ed中的“搜尋”字元，但其實在pattern和替換文字中都未出現的任何其他符號都可以用作分隔符號，使其可讀性更強；這有助於避免“傾斜牙籤綜合徵”。替換命令源自ed中的搜尋-替換，實現了簡單的解析和模板化 。codice_15提供模式匹配和透過子表示式儲存文字的功能，而codice_16可以是純文字，也可以是包含“完全匹配”codice_17，或第"n" 個子表示式儲存的子表示式，格式字串中的codice_18將其替換到輸出裡。其他sed命令.除了替換之外，使用大約25個sed命令可以進行其他形式的簡單處理。例如，下面使用"d" 命令刪除空行或只包含空格的行：sed '/^ *$/d' inputFileName本例使用了下列正則表示式元字元：可以有很複雜的sed結構，讓sed用作一種簡單但高度專業化的程式語言。例如，可以透過使用標籤和分支指令codice_26來管理控制流程。指令codice_26後跟有效的標籤名稱，將把處理流程移動到該標籤後面的塊。sed用作過濾器.在Unix下，sed通常用作管道中的過濾器：generateData | sed 's/x/y/g'也就是說，諸如“generateData”之類的程式生成資料，然後用sed把"x"替換成"y"。例如：$ echo xyz xyz | sed 's/x/y/g'yyz yyz基於檔案的sed指令碼.將幾個sed命令通常很有用：sed -f subst.sed inputFileName &gt; outputFileName可以在指令碼檔案中放置任意數量的命令，使用指令碼檔案也可以避免shell轉義或替換的問題。這樣的指令碼檔案可以直接從命令列執行，方法是在其前面加上一個包含sed命令的"shebang行"，併為該檔案分配可執行許可權。例如，可以使用以下內容建立檔案codice_28：s/x/y/g然後，當前使用者可以使用codice_32命令使檔案可執行：chmod u+x subst.sed然後可以直接從命令列執行該檔案：subst.sed inputFileName &gt; outputFileName就地編輯.GNU sed中引入的codice_33選項允許就地編輯檔案。例如：sed -i 's/abc/def/' fileName示例.Hello, world! 例子.s/.*/Hello, world!/q這個“Hello, world!”指令碼位於檔案中，並使用codice_34呼叫，其中“inputFileName”是輸入文字檔案。指令碼將“inputFileName”第1行更改為“Hello, world!”然後退出，在sed退出之前列印結果。第1行後的任何輸入行都不會被讀取，也不會被列印。唯一的輸出是“Hello, world!”。這個例子強調了sed的許多關鍵特性：其他簡單的例子.下面是各種sed指令碼；可以把它們作為引數傳遞給sed，或者放入一個單獨的檔案並透過codice_7執行或透過使指令碼本身可執行來執行。要把檔案中某個單詞替換為“REDACTED”，並儲存結果：sed -i s/yourpassword/REDACTED/ ./status.freenode.log要刪除包含“yourword”一詞的所有行：/yourword/ d要刪除所有“yourword”這個詞：s/yourword//g要同時從檔案中刪除兩個單詞：s/firstword//gs/secondword//g為了在一行表示前面的示例，比如在命令列輸入時，可以透過分號連線兩個命令：sed "s/firstword//g; s/secondword//g" inputFileName多行處理示例.在下一個示例中，sed會在某一行的後一行以一個空格打頭的情況下刪除換行符。請考慮以下文字：This is my dog,whose name is Frank.This is my fish,whose name is George.This is my goat,whose name is Adam.下面的sed指令碼會將上面的文字轉換為以下文字。請注意，該指令碼僅影響以空格開頭的輸入行：This is my dog, whose name is Frank.This is my fish,whose name is George.This is my goat, whose name is Adam.使用的指令碼是：Ns/\n / /PD這段指令碼應按如下理解：這可以透過分號在一行中表示出來:sed 'N; s/\n / /; P; D' inputFileName限制和替代方案.雖然sed具有簡單性和侷限性，但對於大量用途而言，它的功能已經足夠強大。對於更復雜的處理，可以使用更強大的語言，如AWK或Perl或者PowerShell。雖然使用保持緩衝區理論上可以進行任意複雜的轉換，但如果轉換行的方式比正則表示式提取和模板替換更復雜，則使用一般會使用上面提到的更強大的語言。相反，對於更簡單的操作，grep 更簡單、清晰和快速。ed/sed命令和語法繼續用於派生程式，例如文字編輯器vi和vim。sam/ssam與ed/sed類似，其中sam是Plan 9編輯器，ssam是它的流介面，其功能類似於sed。