Linux 操做系統最大的一個好處是它帶有各類各樣的實用工具。存在如此之多不一樣的實用工具,幾乎不可能知道並瞭解全部這些工具。能夠簡化關鍵狀況下操做的一個實用 工具是 sed。它是任何管理員的工具包中最強大的工具之一,而且能夠證實它本身在關鍵狀況下很是有價值。
sed 實用工具是一個「編輯器」,但它與其它大多數編輯器不一樣。除了不面向屏幕以外,它仍是非交互式的。這意味着您必須將要對數據執行的命令插入到命令行或要處 理的腳本中。當顯示它時,請忘記您在使用 Microsoft Word 或其它大多數編輯器時擁有的交互式編輯文件功能。sed 在一個文件(或文件集)中非交互式、而且不加詢問地接收一系列的命令並執行它們。於是,它流經文本就如同水流經溪流同樣,於是 sed 恰當地表明瞭流編輯器。它能夠用來將全部出現的 "Mr. Smyth" 修改成 "Mr. Smith",或將 "tiger cub" 修改成 "wolf cub"。流編輯器很是適合於執行重複的編輯,這種重複編輯若是由人工完成將花費大量的時間。其參數可能和一次性使用一個簡單的操做所需的參數同樣有限, 或者和一個具備成千上萬行要進行編輯修改的腳本文件同樣複雜。sed 是 Linux 和 UNIX 工具箱中最有用的工具之一,且使用的參數很是少。
sed 的工做方式
sed 實用工具按順序逐行將文件讀入到內存中。而後,它執行爲該行指定的全部操做,並在完成請求的修改以後將該行放回到內存中,以將其轉儲至終端。完成了這一行 上的全部操做以後,它讀取文件的下一行,而後重複該過程直到它完成該文件。如同前面所提到的,默認輸出是將每一行的內容輸出到屏幕上。在這裏,開始涉及到 兩個重要的因素—首先,輸出能夠被重定向到另外一文件中,以保存變化;第二,源文件(默認地)保持不被修改。sed 默認讀取整個文件並對其中的每一行進行修改。不過,能夠按須要將操做限制在指定的行上。
$ echo The tiger cubs will meet on Tuesday after school | sed -e \' s/tiger/wolf/\' -e \'s/after/before/\' The wolf cubs will meet on Tuesday before school $
這是實現它的很是複雜的方法,所以 "-e" 選項不常被大範圍使用。更好的方法是用分號來分隔命令:
$ echo The tiger cubs will meet on Tuesday after school | sed \' s/tiger/wolf/; s/after/before/\' The wolf cubs will meet on Tuesday before school $
注 意分號必須是緊跟斜線以後的下一個字符。若是二者之間有一個空格,操做將不能成功完成,並返回一條錯誤消息。這兩種方法都很好,但許多管理員更喜歡另外一種 方法。要注意的一個關鍵問題是,兩個撇號 (\' \') 之間的所有內容都被解釋爲 sed 命令。直到您輸入了第二個撇號,讀入這些命令的 shell 程序纔會認爲您完成了輸入。這意味着能夠在多行上輸入命令—同時 Linux 將提示符從 PS1 變爲一個延續提示符(一般爲 ">")—直到輸入了第二個撇號。一旦輸入了第二個撇號,而且按下了 Enter 鍵,則處理就進行併產生相同的結果,以下所示:
$ echo The tiger cubs will meet on Tuesday after school | sed \' > s/tiger/wolf/ > s/after/before/\' The wolf cubs will meet on Tuesday before school $
$ echo The tiger cubs will meet this Tuesday at the same time as the meeting last Tuesday | sed \'s/Tuesday/Thursday/\' The tiger cubs will meet this Thursday at the same time as the meeting last Tuesday $
$ echo The tiger cubs will meet this Tuesday at the same time as the meeting last Tuesday | sed \'s/Tuesday/Thursday/g\' The tiger cubs will meet this Thursday at the same time as the meeting last Thursday $
$ cat sample_one one 1 two 1 three 1 one 1 two 1 two 1 three 1 $ 假定但願用 "2" 來替換 "1",但僅在單詞 "two" 以後才做替換,而不是每一行的全部位置。經過指定在給出替換命令以前必須存在一次匹配,能夠實現這一點: $ sed \'/two/ s/1/2/\' sample_one one 1 two 2 three 1 one 1 two 2 two 2 three 1 $ 如今,使其更加準確: $ sed \' > /two/ s/1/2/ > /three/ s/1/3/\' sample_one one 1 two 2 three 3 one 1 two 2 two 2 three 3 $ 請 再次記住惟一改變了的是顯示。若是您查看源文件,您將發現它始終保持不變。您必須將輸出保存至另外一個文件,以實現永久保存。值得重複的是,不對源文件做修 改實際是禍中有福—它讓您可以對文件進行試驗而不會形成任何實際的損害,直到讓正確命令以您預期和但願的方式進行工做。 如下命令將修改後的輸出保存至一個新的文件: $ sed \' > /two/ s/1/2/ > /three/ s/1/3/\' sample_one > sample_two 該輸出文件將全部修改合併在其中,而且這些修改一般將在屏幕上顯示。如今能夠用 head、cat 或任意其它相似的實用工具來進行查看。 腳本文件 sed 工具容許您建立一個腳本文件,其中包含從該文件而不是在命令行進行處理的命令,而且 sed 工具經過 "-f" 選項來引用。經過建立一個腳本文件,您可以一次又一次地重複運行相同的操做,並指定比每次但願從命令行進行處理的操做詳細得多的操做。 考慮如下腳本文件: $ cat sedlist /two/ s/1/2/ /three/ s/1/3/ $ 如今能夠在數據文件上使用腳本文件,得到和咱們以前看到的相同的結果: $ sed -f sedlist sample_one one 1 two 2 three 3 one 1 two 2 two 2 three 3 $ 注意當調用 "-f" 選項時,在源文件內或命令行中不使用撇號。腳本文件,也稱爲源文件,對於想重複屢次的操做和從命令行運行可能出錯的複雜命令頗有價值。編輯源文件並修改一個字符比在命令行中從新輸入一條多行的項目要容易得多。 限制行 編輯器默認查看輸入到流編輯器中的每一行,且默認在輸入到流編輯器中的每一行上進行編輯。這能夠經過在發出命令以前指定約束條件來進行修改。例如,只在此示例文件的輸出的第 5 和第 6 行中用 "2" 來替換 "1",命令將爲: $ sed \'5,6 s/1/2/\' sample_one one 1 two 1 three 1 one 1 two 2 two 2 three 1 $ 在這種狀況下,由於要修改的行是專門指定的,因此不須要替換命令。所以,您能夠靈活地根據匹配準則(能夠是行號或一種匹配模式)來選擇要修改哪些行(從根本上限制修改)。 禁止顯示 sed 默認未來自源文件的每一行顯示到屏幕上(或重定向到一個文件中),而不管該行是否受到編輯操做的影響,"-n" 參數覆蓋了這一操做。"-n" 覆蓋了全部的顯示,而且不顯示任何一行,而不管它們是否被編輯操做修改。例如: $ sed -n -f sedlist sample_one $ $ sed -n -f sedlist sample_one > sample_two $ cat sample_two $ 在 第一個示例中,屏幕上不顯示任何東西。在第二個示例中,不修改任何東西,所以不將任何東西寫到新的文件中—它最後是空的。這不是否認了編輯的所有目的嗎? 爲何這是有用的?它是有用的僅由於 "-n" 選項可以被一條顯示命令 (-p) 覆蓋。爲了說明這一點,假定如今像下面這樣對腳本文件進行了修改: $ cat sedlist /two/ s/1/2/p /three/ s/1/3/p $ 而後下面是運行它的結果: $ sed -n -f sedlist sample_one two 2 three 3 two 2 two 2 three 3 $ 保持不變的行所有不被顯示。只有受到編輯操做影響的行被顯示了。在這種方式下,能夠僅取出這些行,進行修改,而後把它們放到一個單獨的文件中: $ sed -n -f sedlist sample_one > sample_two $ $ cat sample_two two 2 three 3 two 2 two 2 three 3 $ 利用它的另外一種方法是隻顯示必定數量的行。例如,只顯示 2-6 行,同時不作其它的編輯修改: $ sed -n \'2,6p\' sample_one two 1 three 1 one 1 two 1 two 1 $ 其它全部的行被忽略,只有 2-6 行做爲輸出顯示。這是一項出色的功能,其它任何工具都不能容易地實現。Head 將顯示一個文件的頂部,而 tail 將顯示一個文件的底部,但 sed 容許從任意位置取出想要的任意內容。