Linux sed命令(一)基礎
阿新 • • 發佈:2018-11-01
一、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選項中可以用字元甚至正則表示式來模糊匹配:
我們發現,它自動定位到了第二行,然後替換了我們要改的字元。我們可以構造更復雜的正則表示式來匹配和提取複雜的文字,以便完成很多高階操作。 記住:
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操作示例,先建立兩個檔案如下:
而進行 read操作時,會讀取file1中的所有行,將其輸出到file2中用address定位的地方。不會改變兩個原始檔,因此要儲存的話可以使用重定向。
同樣,可以使用模式匹配來確定行,不再贅述。 我們也可以使用組合命令來完成替換等操作,如下,使用r和d,來替換一段文字:
三、其他
- p命令列印文字
- =列印行號
我們同時使用p和=命令,就可以打出特定文字出現的行號了。
通過以上的命令,我們就可以使用sed來完成一些基本的檔案操作了,正確的使用正則表示式定製過濾器是使用sed提取和處理檔案的關鍵,sed還有很多強大的功能還需要去學習和使用。