sed是一個非交互式的流編輯器(stream editor)。所謂非交互式,是指使用sed只能在命令行下輸入編輯命令來編輯文本,然后在屏幕上查看輸出;而所謂流編輯器,是指sed每次只從文件(或輸入)讀入一行,然后對該行進行指定的處理,並將結果輸出到屏幕(除非取消了屏幕輸出又沒有顯式地使用打印命令),接着讀入下一行。整個文件像流水一樣被逐行處理然后逐行輸出。
sed一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接着用sed命令處理緩沖區(pattern space)中的內容,處理完成后,把緩沖區(pattern space)的內容送往屏幕。接着清空緩沖區(pattern space),處理下一行,這樣不斷重復,直到文件末尾。
pattern space(模式空間)相當於車間sed把流內容在這里處理;
hold space(保留空間)相當於倉庫,加工的半成品在這里臨時儲存(當然加工完的成品也在這里存儲)。
How sed Works:
先讀入一行,去掉尾部換行符,存入pattern space,執行編輯命令。
處理完畢,除非加了-n參數,把現在的pattern space打印出來,在后邊打印曾去掉的換行符。
把pattern space內容給hold space,把pattern space置空。
接着讀下一行,處理下一行。
一種非平凡情況,一個文件僅一行,尾部沒換行,sed只打印,不會尾部加換行,但若在尾部又附加了輸出,他會再補上那個換行。
經典實例解釋:
下面的解釋小而簡潔,但是可以將它作為一個准則,幫助你理解sed命令。
SED在哪里緩存數據
SED維護兩個數據緩沖區:主動模式空間(pattern space)和輔助保留空間(hold space)。在“通常”操作中,SED從輸入流讀取一行存入pattern space,這里就是文本編輯操作發生的地方。hold space最初是空的,但也有在pattern space和hold space直接移動數據的命令。
這里,我們用SED的“x”命令來做一個小實驗:
'x' - 交換pattern space和hold space的內容
一個文件包含三行:
#cat file line1 line2 line3 #
用SED x 命令操作后:
#sed 'x' file line1 line2 #
解釋:
#sed 'x' file
<-- 第一行是空的,因為hold space和pattern space交換了內容,記住最初的時候hold space是空的;在處理完第一行后,現在hold space的內容是line1。
line1 <-- 第二行輸出是line1,現在hold space的內容是line2,and so on a so forth . ^_^
line2
#
------------------
操作pattern space和hold space的命令:
$ man sed d Delete pattern space. Start next cycle. 刪除pattern space的內容,開始下一個循環. h H Copy/append pattern space to hold space. 復制/追加pattern space的內容到hold space. g G Copy/append hold space to pattern space. 復制/追加hold space的內容到pattern space. x Exchange the contents of the hold and pattern spaces. 交換hold space和pattern space的內容.
課后理解:
1)交換第1行和第2行的內容
$ sed -n '1{h;n;x;H;x};p' filename
2)用sed實現tac的功能
$ sed -n -e '1!G;h;$p' filename
$ sed -e '1!G;h;$!d' filename
這2種寫法都相當於tac filename。

$ sed 'H;g' t.txt
one
one
two
one
two
three
是不是有點沒看懂,我作個圖你就看懂了。
第二個示例,反序了一個文件的行:
$ sed '1!G;h;$!d' t.txt three two one
其中的 ’1!G;h;$!d’ 可拆解為三個命令
- 1!G —— 只有第一行不執行G命令,將hold space中的內容append回到pattern space
- h —— 第一行都執行h命令,將pattern space中的內容拷貝到hold space中
- $!d —— 除了最后一行不執行d命令,其它行都執行d命令,刪除當前行
這個執行序列很難理解,做個圖如下大家就明白了:
就先說這么多吧,希望對大家有用。
(全文完)