sed知识整理:模式空间
轉(zhuǎn)載自:
http://blog.csdn.net/wanglelelihuanhuan/article/details/51591809
sed之所以能以行為單位的編輯或修改文本,其原因在于它使用了兩個空間:一個是活動的“模式空間(pattern space)”,另一個是起輔助作用的“保持空間(hold space)這2個空間的使用。
模式空間:可以想成工程里面的流水線,數(shù)據(jù)之間在它上面進(jìn)行處理。
保持空間:可以想象成倉庫,我們在進(jìn)行數(shù)據(jù)處理的時候,作為數(shù)據(jù)的暫存區(qū)域。
正常情況下,如果不顯示使用某些高級命令,保持空間不會使用到!
sed在正常情況下,將處理的行讀入模式空間,腳本中的“sed command(sed命令)”就一條接著一條進(jìn)行處理,直到腳本執(zhí)行完畢。然后該行被輸出,模式被清空;接著,在重復(fù)執(zhí)行剛才的動作,文件中的新的一行被讀入,直到文件處理完畢。
?
一般情況下,數(shù)據(jù)的處理只使用模式空間(pattern space),按照如上的邏輯即可完成主要任務(wù)。但是某些時候,通過使用保持空間(hold space),還可以帶來意想不到的效果。
sed命令:
+ g:[address[,address]]g 將hold space中的內(nèi)容拷貝到pattern space中,原來pattern space里的內(nèi)容清除。
+ G:[address[,address]]G 將hold space中的內(nèi)容append到pattern space\n后。
+ h:[address[,address]]h 將pattern space中的內(nèi)容拷貝到hold space中,原來的hold space里的內(nèi)容被清除。
+ H:[address[,address]]H 將pattern space中的內(nèi)容append到hold space\n后。
+ d:[address[,address]]d 刪除pattern中的所有行,并讀入下一新行到pattern中。
+ D:[address[,address]]D 刪除multiline pattern中的第一行,不讀入下一行。
+ x:交換保持空間和模式空間的內(nèi)容。
?
1. 給每行結(jié)尾添加一行空行???????????????????????????????????????????????????????????????????????????????????????????????????
2.用sed模擬出tac的功能(倒序輸出)
1!G:第1行不執(zhí)行“G”命令,從第2行開始執(zhí)行。$!d:最后一行不刪除(保留最后1行)。
3.追加匹配行到文件結(jié)尾
-e :進(jìn)行多項編輯,即對輸入行應(yīng)用多條sed命令時使用
4.行列轉(zhuǎn)化
-n :取消默認(rèn)的輸出
H表示把pattern space 的內(nèi)容追加到hold space中去,H可以帶一個地址,這里用的是$,表示到文件的末尾,然后用x將之取到pattern space中,把\n替換成空格再打印即可。
5. 行列轉(zhuǎn)化,求1~100的求和
seq 100?==>豎排打印1...100個數(shù)字。
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. 打印奇偶數(shù)行
附:awk打印奇偶行
方法一:
NR是行號,awk的內(nèi)建函數(shù),當(dāng)?shù)谝恍?#xff0c;NR==1時,對2取余,結(jié)果是1,在awk的執(zhí)行模式里,這個1就是pattern,為真,執(zhí)行默認(rèn)的{print},這個action操作。那么打印出該行,到第2行則余數(shù)是0,pattern為0,則為假,不會執(zhí)行默認(rèn)的{print},則不會輸出偶數(shù)行。就達(dá)到了只輸出奇數(shù)行的效果,反之則輸出偶數(shù)行了。
方法二:
?這行命令充分的利用了C語言中 ++i 與 i++ 的區(qū)別,i++ 中i的值自加一次后這個表達(dá)式的結(jié)果等于1,但此時i的值仍然為0,i的值在當(dāng)前表達(dá)式中不會改變,++i中i的值自加一次后,i的值是1。第一行時,因為對2取余的時候 i++ 自加一次后的值是1,但 i++ 是把i的自加前的值去對2取余的,0對2取余結(jié)果為0,條件為假,到第二行的時候i的值才是上次自加后的值為1,對2取余數(shù)為1,pattern為真,則輸出第2行,以此類推。++i 則是自加后i的值是1,所以輸出的奇數(shù)行。
方法三:
方法四:
awk里面有三個built-in function,分別是:and(a, b)按位與,or(a, b)按位或,xor(a, b)按位異或,當(dāng)FNR為1的時候,就是第一行,1的2進(jìn)制為0001,與0001按位與,得到結(jié)果是0001,0001的結(jié)果為真,就打印改行,當(dāng)FNR為2時二進(jìn)制表示為0010,那么又與0001相與,結(jié)果為0000,條件為假,則不打印。只有當(dāng)FNR為奇數(shù)時,二進(jìn)制的尾數(shù)為1,與0001相與結(jié)果才為真,否則結(jié)果都為假。即只輸出奇數(shù)行,非則輸出偶數(shù)行。
7.求1~100和
:a表示標(biāo)簽a,ba表示跳轉(zhuǎn)到a標(biāo)簽,$表示最后一行,!表示不做后續(xù)操作,所以,$!ba表示最后一行不用跳轉(zhuǎn)到a標(biāo)簽,結(jié)束此次操作。
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的sed知识整理:模式空间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。