sed的模式空間和保持空間
摘自:https://blog.csdn.net/wanglelelihuanhuan/article/details/51591809
sed的模式空間和保持空間
2016年06月06日 17:15:07 wanglelelihuanhuan 閱讀數:3022 所屬專欄: 王樂樂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的模式空間和保持空間