1. 程式人生 > >Linux sed命令(一)基礎

Linux sed命令(一)基礎

一、sed命令簡介

sed(StreamEditor)是一個“非互動式的”面向字元流的編輯器,能同時處理多個檔案多行的內容。處理時,把當前處理的行儲存在臨時緩衝區中,接著用sed命令處理,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。並且原始檔內容沒有改變,除非你使用重定向儲存輸出。其功能非常強大,更是編寫shell指令碼必會的命令之一。

二、sed命令基本使用

對行的操作

基礎就是查詢到這一行(定址方式),然後才能操作這一行。在sed中有兩種方式來進行行定址:
  • 以數字形式表示行區間
  • 用文字模式來過濾輸出行

1、替換

命令格式如下:
sed  '[address]s/old/new/flag'  file

其中sed後的命令需要用單引號'括起來,最後的file表示的是對這個檔案進行的操作。方括號[ ]中的address表示定址方式,是個可選的選項。有四種可用的替換標記(flag位):
  • 數字,表示新文字替換第幾處的old文字
  • g,新文字會替換所有匹配的
  • p,原先行的內容要打印出來
  • w file,將替換的結果寫入檔案
下面我們做一個簡單的演示,方便理解,我們先建立如下這樣一個檔案:


然後進行一個基本的替換操作:
很容易看見,1111被成功的替換成了new1111。注意,接著執行cat後,發現原始檔並沒有變,只是在流中操作而已,如果需要儲存,需要使用重定向。 如果我們需要修改某一行中的一個字元,一直到最後一行,應該怎麼辦呢?可以使用$符號,來代表最後一行,見如下示例:
如果,我們僅需要修改第二行呢?那麼在address選項中可以用字元甚至正則表示式來模糊匹配:
我們發現,它自動定位到了第二行,然後替換了我們要改的字元。我們可以構造更復雜的正則表示式來匹配和提取複雜的文字,以便完成很多高階操作。 記住:
這裡定位行的方法,在大多數操作裡面都是可以用的。如果是數字定位行,直接寫數字就可以了:如2s(替換第二行)、2,8s(替換第2到8行);如果是字元模式,則需要用正斜槓/將其包裹起來,如/demo/s(替換含有demo字串的行)。

2、增加

對於增加行的操作,有兩個關鍵字i和a,即i是在行前插入,a是在行後附加一行。命令格式如下:
sed '[address]i|a\string' file
表示的是對file檔案進行操作,將string加到響應的位置。注意,這裡是反斜槓 \。 還是用前面的例子,我們在第一和二行前面加上一個新行,可以用如下操作:
同樣,增加行的操作也是支援模式定址方式的;

3、刪除

刪除操作的關鍵字是d,它的命令就更簡單了:
sed '[address]d' file
意思也很直觀,就是刪除file檔案中,匹配到的行。


4、修改

修改行的關鍵字為c,命令格式為:
sed '[address]c\new string' file
注意這裡是反斜槓。即對file檔案中匹配到的行進行修改操作。

這裡要特別注意的是, 如果使用地址區間,會將此區間替換成new string,而非對每一行進行替換!

對字元的操作:

sed中對字元的操作,用的是轉換命令,關鍵字為y,是唯一一個可以處理單個字元的sed編輯器命令。格式如下:
sed '[address]y/oldchar/newchar/' file
特別注意這裡的oldchar和newchar位數必須相同,執行命令後,確定操作的行後,會逐個對應字元,去替換。 觀察下圖可以發現,進行的操作即是,精第二行所有的小寫n,換位大寫N。


處理檔案:

sed處理檔案,可分為讀和寫檔案。w命令向檔案中寫入行,r命令從檔案中讀出資料再向資料流中插入或附加文字。
sed '[address]w file1' file2
sed '[address]r file1' file2
意思分別為:w-將file2中匹配到的行,寫入到file1;r-將file1中的所有行,讀取並輸出到file2。 請看如下 write操作示例,先建立兩個檔案如下:


從上圖可以看到,執行sed的write操作時,輸出的時file2檔案中的內容,然而當我們檢視寫入的file1時發現操作已經完成了,因此使用此命令要特別小心,不要覆蓋了有用的文件!
而進行 read操作時,會讀取file1中的所有行,將其輸出到file2中用address定位的地方。不會改變兩個原始檔,因此要儲存的話可以使用重定向。
同樣,可以使用模式匹配來確定行,不再贅述。 我們也可以使用組合命令來完成替換等操作,如下,使用r和d,來替換一段文字:


三、其他


  • p命令列印文字
  • =列印行號
這連個命令可以用來列印資料流中的資訊:(使用-n不產生命令輸出,使用print命令來完成輸出)
我們同時使用p和=命令,就可以打出特定文字出現的行號了。
通過以上的命令,我們就可以使用sed來完成一些基本的檔案操作了,正確的使用正則表示式定製過濾器是使用sed提取和處理檔案的關鍵,sed還有很多強大的功能還需要去學習和使用。