sed之G、H、g、h使用

前言

作者不善言談,如有錯誤請指正!!!

轉載請註明出處!!!

sed之G、H、g、h使用

什麼是sed?

sed是面向流的行編輯器,所謂面向流,是指接受標準輸入的輸入,輸出內容到標準輸出上。

sed如何處理數據?

sed在正常情況下,將處理的行讀入模式空間(pattern space),腳本中的“sed-command(sed命令)”就一條接着一條進行處理,知道腳本執行完畢。然後該行唄輸出,模式(pattern space)被清空;接着,在重複執行剛纔的動作,文件中的新的一行被讀入,直到文件處理完畢。

 

什麼是Pattern Space,什麼是Hold Space?

pattern space相當於車間sed把流內容在這裏處理。

hold space相當於倉庫,加工的半成品在這裏臨時儲存。

PS:你可以將pattern space看成是一個流水線,所有的動作都是在“流水線”上執行的;而hold space是一個“倉庫”,“流水線”上的東東都可以放到這裏。

爲什麼要使用sed高級命令(G、H、g、h、n、N、x)?

由於各種各樣的原因,比如用戶希望在某個條件下腳本中的某個命令被執行,或者希望模式空間得到保留以便下一次的處理,都有可能使得sed在處理文件的時候不按照正常的流程來進行。這個時候,sed設置了一些高級命令來滿足用戶的要求。

sed命令:

+ g:[address[,address]]g 將hold space中的內容拷貝到pattern space中,原來pattern space裏的內容清除

+ G:[address[,address]]G 將hold space中的內容append到pattern space\n後

+ h:[address[,address]]h 將pattern space中的內容拷貝到hold space中,原來的hold space裏的內容被清除

+ H:[address[,address]]H 將pattern space中的內容append到hold space\n後

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

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

PS:不論是使用G、g還是H、h,它們都是將hold space裏面的內容“copy”到pattern space中或者將pattern space中的內容“copy”到hold space中。

附上英文的解釋(注意其中的高亮單詞):

The "h" command copies the pattern buffer into the hold buffer. The pattern buffer is unchanged.

Instead of exchanging the hold space with the pattern space, you can copy the hold space to the pattern space with the "g" command. This deletes the pattern space. If you want to append to the pattern space, use the "G" command. This adds a new line to the pattern space, and copies the hold space after the new line.

 

示例:用sed模擬出tac的功能(倒序輸出)。

文件內容

cat mm

1

2

3

 

解決方法:

sed ‘1!G;h;$!d’mm

ps:1!G第1行不 執行“G”命令,從第2行開始執行。

       $!d,最後一行不刪除(保留最後1行)

圖解分析過程

P:Pattern Space

H:Hold Space

藍色:Hold Space中的數據

綠色:Pattern Space中的數據

參考:

《sed and awk 第二版》

Sed - An Introduction and Tutorial by Bruce Barnett

sed的高級應用 - haijd Article

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章