1. 程式人生 > >sed的模式空間和保持空間

sed的模式空間和保持空間

pos 刪除 tex 所有 sys 原因 匹配 內容 html


摘自:https://blog.csdn.net/wanglelelihuanhuan/article/details/51591809

sed的模式空間和保持空間

2016年06月06日 17:15:07 wanglelelihuanhuan 閱讀數:3022 標簽: shell腳本sed 所屬專欄: 王樂樂

sed之所以能以行為單位的編輯或修改文本,其原因在於它使用了兩個空間:一個是活動的“模式空間(pattern space)”,另一個是起輔助作用的“保持空間(hold space)這2個空間的使用。

模式空間:可以想成工程裏面的流水線,數據之間在它上面進行處理。
保持空間:可以想象成倉庫,我們在進行數據處理的時候,作為數據的暫存區域。

正常情況下,如果不顯示使用某些高級命令,保持空間不會使用到!

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

技術分享圖片

一般情況下,數據的處理只使用模式空間(pattern space),按照如上的邏輯即可完成主要任務。但是某些時候,通過使用保持空間(hold space),還可以帶來意想不到的效果。

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中的第一行,不讀入下一行。
+ x:交換保持空間和模式空間的內容。

1. 給每行結尾添加一行空行

技術分享圖片

2.用sed模擬出tac的功能(倒序輸出)

技術分享圖片

1!G:第1行不執行“G”命令,從第2行開始執行。$!d:最後一行不刪除(保留最後1行)。

3.追加匹配行到文件結尾

技術分享圖片

-e :進行多項編輯,即對輸入行應用多條sed命令時使用

4.行列轉化

技術分享圖片

-n :取消默認的輸出

H表示把pattern space 的內容追加到hold space中去,H可以帶一個地址,這裏用的是$,表示到文件的末尾,然後用x將之取到pattern space中,把\n替換成空格再打印即可。

5. 行列轉化,求1~100的求和

技術分享圖片
seq 100 ==>豎排打印1...100個數字。

bc ==>交給bc計算

附:seq命令的語法

1)生成序列[1…LAST]
例:seq 5 表示序列為 1 2 3 4 5

技術分享圖片

2)生成序列[FIRST…LAST],步長為1

例:seq 2 5表示序列為 2 3 4 5

技術分享圖片

3)生成序列[FIRST…LAST],步長為INCREMENT

例:seq 2 2 5表示序列為 2 4

技術分享圖片

6. 打印奇偶數行

技術分享圖片

技術分享圖片

附:awk打印奇偶行

方法一:

技術分享圖片

NR是行號,awk的內建函數,當第一行,NR==1時,對2取余,結果是1,在awk的執行模式裏,這個1就是pattern,為真,執行默認的{print},這個action操作。那麽打印出該行,到第2行則余數是0,pattern為0,則為假,不會執行默認的{print},則不會輸出偶數行。就達到了只輸出奇數行的效果,反之則輸出偶數行了

方法二:

技術分享圖片

這行命令充分的利用了C語言中 ++i 與 i++ 的區別,i++ 中i的值自加一次後這個表達式的結果等於1,但此時i的值仍然為0,i的值在當前表達式中不會改變,++i中i的值自加一次後,i的值是1第一行時,因為對2取余的時候 i++ 自加一次後的值是1,但 i++ 是把i的自加前的值去對2取余的,0對2取余結果為0,條件為假,到第二行的時候i的值才是上次自加後的值為1,對2取余數為1,pattern為真,則輸出第2行,以此類推。++i 則是自加後i的值是1,所以輸出的奇數行。

方法三:

技術分享圖片

方法四:

技術分享圖片

awk裏面有三個built-in function,分別是:and(a, b)按位與,or(a, b)按位或,xor(a, b)按位異或,當FNR為1的時候,就是第一行,1的2進制為0001,與0001按位與,得到結果是0001,0001的結果為真,就打印改行,當FNR為2時二進制表示為0010,那麽又與0001相與,結果為0000,條件為假,則不打印。只有當FNR為奇數時,二進制的尾數為1,與0001相與結果才為真,否則結果都為假。即只輸出奇數行,非則輸出偶數行。

7.求1~100和

技術分享圖片

:a表示標簽a,ba表示跳轉到a標簽,$表示最後一行,!表示不做後續操作,所以,$!ba表示最後一行不用跳轉到a標簽,結束此次操作。

sed的模式空間和保持空間