sed的工作原理(pattern space 和 hold space)


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命令,刪除當前行

這個執行序列很難理解,做個圖如下大家就明白了:

就先說這么多吧,希望對大家有用。

(全文完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM