日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sed知识整理:模式空间

發(fā)布時間:2024/4/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sed知识整理:模式空间 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。