sed ‘1!G;h;$!d’解析

wang_0720發表於2014-09-22

1 sed簡介

sed是面向流的行編輯器。所謂面向流,是指接受標準輸入的輸入,輸出內容到標準輸出上。sed編輯器逐行處理檔案(或輸入),並將結果傳送到螢幕。

具體過程如下: sed將處理的行讀入到一個臨時快取區中(也稱為模式空間pattern space),sed中的命令依次執行,直到所有命令執行完畢,完成後把該行傳送到螢幕上,清理pattern space中的內容;接著重複剛才的動作,讀入下一行,直到檔案處理結束。

sed每處理完一行就將其從pattern space中刪除,然後將下一行讀入,進行處理和顯示。處理完輸入 檔案的最後一行後,sed便結束執行。sed把每一行都存在臨時緩衝區中,對這個副本進行編輯,所以不會修改原檔案。

2 sed執行流程圖


3 什麼是Pattern Space,Hold Space

Pattern Space相當於車間,sed把流內容在這裡進行處理,Hold Space相當於倉庫,加工的半成品在這裡進行臨時儲存。

由於各種原因,比如使用者希望在某個條件下指令碼中的某個命令被執行,或者希望模式空間得到儲存以便下一次處理,都有可能使得sed在處理檔案的時候不按照正常的流程來進行。這個時候,sed設定了一些高階命令來滿足使用者的要求。

一些高階命令

g: hold space中的內容複製到pattern space中,原來pattern space裡的內容被覆蓋

G:將hold space中的內容appendpattern space\n

h: pattern space中的內容複製到hold space中,原來hold space裡的內容被覆蓋

H: pattern space中的內容appendhold space\n

d: 刪除pattern中的所有行,並讀入下一新行到pattern

D: 刪除multiline pattern中的第一行,不讀入下一行

4 圖解sed ‘1!G;h;$!d’ file

1!G 第一行不執行G命令,從第二行開始執行

$!d 最後一行不刪除

[root@localhost test]# cat file

1 1 1

2 2 2

3 3 3

 

[root@localhost test]# sed '1!G;h;$!d' file

3 3 3

2 2 2

1 1 1

圖中P代表Pattern Space,H代表Hold Space。綠色代表pattern space中的資料,藍色代表hold space中的資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27181165/viewspace-1276719/,如需轉載,請註明出處,否則將追究法律責任。

相關文章