sed高級用法:模式空間(pattern space)和保持空間(hold space)


sed高級用法:模式空間(pattern space)和保持空間(hold space)

環境:centos 6.4 

sed版本:sed-4.2.1-10.el6.x86_64

 

前面的基本用法已經可以滿足90%的需要,人個認為想要真正掌握sed,還需要學習一下sed的高級用法,本節就詳細講解一下sed的模式空間和保持空間

 

前面基本用法中也有提到模式空間,即為處理文件中一行內容的一個臨時緩沖區。處理完一行之后就會把模式空間中的內容打印到標准輸出,然后自動清空緩存。

而這里說的保持空間是sed中的另外一個緩沖區,此緩沖區正如其名,不會自動清空,但也不會主動把此緩沖區中的內容打印到標准輸出中。而是需要以下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的內容.

 

下面以一個例子來說明上面命令的用法,例如有一個文件,我們可以用tac命令反序打印出文件的內容,其實用sed的話也可以實現,這里先將結果列出,再詳細講解

不錯就是一行命令就可實現:

 

sed '1!G;h;$!d' file

 

通過下面的講解大家可以了解到sed的處理機制以及處理過程:

說明:

 

  • 第一行左邊為文件內容,箭頭所指為sed當前處理的行,右側為sed命令;
  • 后面三行左側綠色為模式空間內容,右側藍色為保持空間內容。
  • 每次sed只讀取文件中一行到模式空間,即每次執行sed命令前,模式空間中只有文件中當前處理行內容,這一點沒有在圖中表現。
  • 每一行表示一個命令處理完后兩個空間中的內容

 

困為每一步驟都很清楚,所以只把執行的結果以圖形表示,不做說明,可以對照前面對sed命令的說明,以加深理解

1,讀取文件的行一行"First"進行處理,最后一個命令將模式空間內容刪除,所以不會在屏幕上打印內容

2,讀取第二行“Sencond”進行處理,最后一個命令將模式空間內容刪除,所以不會在屏幕上打印內容

3,讀取第三行“three”進行處理,注意sed處理完之后會把,會把模式空間中內容打印到屏幕並自動清空模式空間(這個沒在圖中表現)

 

其實這個功能還可以用下面命令實現:

 

sed -n '1!G;h;$p' file
說明:

 

-n: 表示不輸出sed的處理結果,而想要輸出,則需要要顯示的用“p”命令

 

其實sed的高級命令還有幾個,可以分為三組,后續有機會再學習其他兩組命令:

 

 

  1.   處理多行模式空間(N、D、P)。
  2.   采用保持空間來保存模式空間的內容並使它可用於后續的命令(H、h、G、g、x)。
  3.   編寫使用分支和條件指令的腳本來更改控制流(:、b、t)。


免責聲明!

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



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