亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 5623 | 回復(fù): 9
打印 上一主題 下一主題

[學(xué)習(xí)共享] sed-b/t/T/p/P/d/D-smallpboy筆記 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-08-10 09:32 |只看該作者 |倒序?yàn)g覽
本帖最后由 smallpboy 于 2012-08-24 11:06 編輯

    上次貼了一部分sed的內(nèi)容,今天把全部的內(nèi)容都貼出來。這兩天沒上cu,看到版主及其他大哥們的留言,小弟微微改下語句及排版等。讓這文章再混個(gè)前排,罪過。罪過。
1、b/t/T的區(qū)別
    所謂的標(biāo)簽,其功能就像c++里的“l(fā)oop:”和“goto”!癰”操作的范例如下:
[smallpboy @local tmp]$ cat file
111
222
[smallpboy @local tmp]$ cat file | sed –n ‘/^1/b f;p;:f;p’
111
222
222
仔細(xì)看sed里面的內(nèi)容,”/^1/b f”這個(gè)就是說匹配開頭字母是1的,‘b’后面跟的‘f’實(shí)際上就想一個(gè)旗標(biāo),它標(biāo)志著‘b’操作跳轉(zhuǎn)到哪。這不后面不出現(xiàn)了”:f;p”語句么,‘:f’就是這個(gè)旗標(biāo),‘p’表示打印pattern space內(nèi)容。所以,行首如果是‘1’的話,就會(huì)跳過一個(gè)‘p’操作(第一個(gè)被跳過),這樣解釋能看懂輸出結(jié)果了吧。
    接下來是t/T的范例:
[smallpboy @local tmp]$ cat file | sed –n ‘s/^1/&/;t f;p;:f;p ’
111
222
222
[smallpboy @local tmp]$ cat file | sed –n ‘s/^1/&/;T f;p;:f;p ’
111
111
222
t/T操作的區(qū)別看出來吧?‘t’操作表示前面的‘s/1^/&/’匹配成功,就跳到‘f’那去,‘T’操作則正好跟它相反!&’是什么東西?就不告訴你啊,就不告訴你。
    “b/t/T”操作的功能就都說啦,是不是很簡(jiǎn)單? 對(duì)了,如果你不在“b/t/T”后面加上旗標(biāo)‘f’的話,它默認(rèn)是直接跳到腳本末尾。你可以試試如下命令:
[smallpboy @local tmp]$ cat file | sed –n ‘s/^1/&/;T;p;:f;p ’
111
111
看清楚哦,‘T’后面可沒有‘f’咯,所以當(dāng)‘T’操作滿足時(shí),直接跳到腳本尾了,什么輸出都沒有。而后面這個(gè)‘:f’你盡管保留,有它沒它都不影響腳本。

2、p/P操作
    這兩個(gè)其實(shí)沒啥說的,‘小p’表示打印pattern space全部?jī)?nèi)容!驪’表示打印pattern space的第一行。看下面的例子:
[smallpboy @local tmp]$ cat file
111
222
[smallpboy @local tmp]$ cat file | sed –n ‘/.*/G;p’        #小p
111

222

[smallpboy @local tmp]$ cat file | sed –n ‘/.*/G;P’       #大p
111
222
‘G’操作你已經(jīng)很熟悉了吧?是不是把hold space的內(nèi)容添加到pattern space中?這樣,上面的例子能理解了吧。

3、d/D操作
    ‘d’操作沒什么好講的,一股腦將pattern space全部刪除,這個(gè)‘D’操作就有不少人理解不過來了。好了,看我下面的例子你就清楚啦。
[smallpboy @local tmp]$ seq 4 | sed ‘$!N;d’
[smallpboy @local tmp]$
沒有輸出?對(duì)的,這個(gè)好理解吧!‘$!N’意思是如果還沒讀到最后一行,就繼續(xù)讀入一行(這個(gè)不用解釋吧,不清楚試試’$!‘、'3!'這些語句去吧。)。
[smallpboy @local tmp]$ seq 4 | sed ‘$!N;D’
[smallpboy @local tmp]$
還是沒有輸出?對(duì),因?yàn)檫@個(gè)‘D’是循環(huán)地一行一行刪除pattern space內(nèi)容,如果沒有限制它跟‘d’功能是一樣的。限制?怎樣限制呢?限制什么東西,是pattern space還是文本行?
[smallpboy @local tmp]$ seq 4 | sed ‘$!N;4D’
1
2
[smallpboy @local tmp]$ seq 4 | sed ‘$!N;3D’
1
2
3
4
上面這兩個(gè)能理解么?‘4D’意思就是第4行執(zhí)行‘D’操作(原來限制的對(duì)象是文本),即sed你讀到第四行的話我就刪除pattern space第一行,再刪第二行。所以它輸出1\n2。我相信第一個(gè)你也許能理解,但這第二個(gè)真是不好理解啊。對(duì)吧?
    ‘3D’ 的意思是sed你讀到第3行的話,我執(zhí)行‘D’操作,很可惜啊。當(dāng)sed讀到第3行后,立刻又執(zhí)行了‘$!N’操作,所以執(zhí)行“3D”時(shí),sed已經(jīng)讀到第4行了。所以這個(gè)‘D’不被執(zhí)行啦。所以輸出是上述結(jié)果,這下你懂了吧。在這條語句中,奇數(shù)行根本就取不到它,你寫‘1D‘、’3d‘全判為假。這樣,下面的例子你也能理解了。
[smallpboy @local tmp]$ seq 4 | sed ‘N;d’
[smallpboy @local tmp]$ seq 5 | sed ‘N;d’
5
第一個(gè)例子沒有輸出,當(dāng)sed共讀入四行時(shí),他們兩行兩行配對(duì),所以都被‘d‘了。而第二個(gè)例子中,當(dāng)sed讀到第5行后,執(zhí)行’N‘操作,發(fā)現(xiàn)沒有了(就算出錯(cuò)了哈),直接跳到腳本尾了。所以,它輸出5。不信,你動(dòng)手試試看啊。
    好了,上面說了一堆,還沒有講到“D”操作。還有一個(gè)很重要的問題就是,我就是想要‘D’只刪除pattern space的第一行,那要怎么辦。man sed里‘D’的解釋是:
delete up to the first embedded newline in the pattern space.start next cycle,but skip reading from the input if there is still data in the pattern space.
刪除模式空間的第一個(gè)新行,開始下一個(gè)循環(huán),模式空間有數(shù)據(jù)的話,不繼續(xù)讀入input數(shù)據(jù),也就是繼續(xù)循環(huán)‘D’操作。
[smallpboy @local tmp]$ seq 4 | sed –n ‘$!N;D;p’
2
4
上述命令‘$!N’讀入“1\n2”進(jìn)來,然后執(zhí)行‘D’操作,刪除pattern space第一行,然后‘p’操作把它打印出來。 你也是不是跟我一樣想的呢?
可實(shí)際上,上述語句并沒有任何輸出!瓺’操作會(huì)循環(huán)執(zhí)行刪除pattern space一行的動(dòng)作,知道pattern space沒有數(shù)據(jù)為止。所以,pattern 里面的數(shù)據(jù)都被刪光了。
再來看下面的例子:
[smallpboy @local tmp]$ seq 4 | sed –n ‘N;2D;p’
2
3
[smallpboy @local tmp]$ seq 4 | sed –n ‘N;3D;p’
1
2
3
4
不好意思,先把難的放第一個(gè)了。這個(gè)真的不好懂啊,我弄了好幾小時(shí)才把‘D’弄明白啊。
    ‘sed’先讀入‘1’(這算是sed的input,和'N'操作的input要分開),然后執(zhí)行‘N’,讀入‘2’。然后‘2D’,表示對(duì)第2行‘D’操作,這時(shí),文本確實(shí)已經(jīng)讀到第2行,所以‘2D’成功執(zhí)行把pattern space里‘1\n’給刪除了。然后,注意了啊,‘D’操作并沒有結(jié)束啊,pattern space還有‘2’呢,這時(shí)它繼續(xù)從腳本開頭執(zhí)行,也就是‘N’操作,這時(shí)把‘3’讀入(你可能會(huì)問,不是pattern space不為空,就不讀input嗎?你說的對(duì)啊,但是sed它確實(shí)沒有主動(dòng)讀入input啊,而是‘N’操作讀入了下一行,你把‘N’換成別的,那也就沒有input數(shù)據(jù)了。)。好了,繼續(xù)講。讀入‘3’后,到第三行了,‘2D’為假了,所以不執(zhí)行‘D’操作了,終于輪到‘p’操作了,這時(shí)pattern space的結(jié)果是不是‘2\n3’啊,被打印出來。接著,sed主動(dòng)讀入‘4’,然后執(zhí)行‘N’操作,發(fā)現(xiàn)沒有下一行了,出錯(cuò)了就直接跳到腳本末尾,所以‘p’操作都不執(zhí)行了。這樣,‘4’也打印不出了。不信的話,你試試下面的腳本就能打印出‘4’來了。
[smallpboy @local tmp]$ seq 4 | sed –n ‘$!N;2D;p’
    在這里我插一句,很多人就是因?yàn)闇y(cè)試時(shí)傳進(jìn)來參數(shù)的個(gè)數(shù)---奇數(shù)和偶數(shù)不同而導(dǎo)致產(chǎn)生不同的結(jié)果。
[smallpboy @local tmp]$ seq 5 | sed ‘N;d’
5
上述這個(gè)結(jié)果,居然出現(xiàn)了‘5’,看懂我前面講的同學(xué),你一定已經(jīng)知道怎么回事了。輸出的‘5’,它不是‘D’沒有刪除pattern space,而是執(zhí)行‘$!N’時(shí)出錯(cuò),直接跳過‘D’操作了。
說到這,‘D’操作也說完了?偟膩碚f,注意的無非一點(diǎn):

    * 當(dāng)類似‘N;2D;P’這樣,‘D’滿足條件的就會(huì)跳到腳本開頭執(zhí)行腳本,在這里也就是執(zhí)行‘N’操作,然后再‘2D’操作,當(dāng)‘2D’不滿足條件后,才執(zhí)行‘p’。

上回說到sed實(shí)現(xiàn)rev功能時(shí),最后說到‘//D’操作真心不懂。現(xiàn)在咱再?gòu)念^開始捋一遍。
    整個(gè)語句:sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//;’
   
    “/\n/!G;”在stdin中沒有找到\n,就主動(dòng)添上\n。
    “s/\(.\)\(.*\n\)/&\2\1/;”中\(zhòng)(.\)先匹配一個(gè)字符,再匹配剩下所有字符!&”指整個(gè)pattern space,\2和\1想必你也知道是什么東東。
[smallpboy @local tmp]$ cat file
123
file文件中“123”(上回是‘123\n’,其實(shí)你用’vi’編輯沒有敲回車的話它并沒有‘\n’,加不加‘\n’其實(shí)是有關(guān)系的,這里我不能再單獨(dú)講他們的區(qū)別,思維很混亂。)執(zhí)行‘/\n/!G’,變成‘123\n’,然后執(zhí)行‘s/\(.\)\(.*\n\)/&\2\1/;’
[smallpboy @local tmp]$ cat file | sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;’
123
23
1
上面可能讀懂?“123\n”分別被匹配為\1(1)和\2(23\n),所以&\2\1的結(jié)果為‘123\n23\n1’。
[smallpboy @local tmp]$ cat file | sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D’
上面說到第一次執(zhí)行s….后,pattern space為‘123\n23\n1’,然后要執(zhí)行‘//D’命令了,結(jié)果為23\n1。
然后到開頭繼續(xù)執(zhí)行/\n/!G;,pattern space(舊的)不變,然后執(zhí)行s….后,新的pattern space為23\n3\n21(\1為2,\2為3\n,&為23\n),然后執(zhí)行//D,結(jié)果為3\n21。
再執(zhí)行/\n/!G;,pattern space(下一操作s….會(huì)產(chǎn)生新的pattern space把這個(gè)給覆蓋)不變,執(zhí)行s….,結(jié)果變?yōu)?\n\n321(\1為3,\2為\n,&為3\n),再執(zhí)行//D操作,結(jié)果為\n321。
繼續(xù)執(zhí)行/\n/!G;,pattern space不變,然后執(zhí)行s….,發(fā)現(xiàn)匹配不了。執(zhí)行//D操作,‘//’不匹配,也不執(zhí)行‘D’操作。所以‘sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D’’的結(jié)果為‘\n321’,最后執(zhí)行‘s/.//’操作,所以最終打印出‘321’。
[smallpboy @local tmp]$ cat file | sed –n ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;P;//D’  
123
23
3

[smallpboy @local tmp]$ cat file | sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D’

321
最后的,這個(gè)’//D’并沒有匹配上‘\n321’,我到現(xiàn)在也不明白‘//D’這兩個(gè)‘//’是什么意思,是匹配空字符嗎?希望知道的朋友能在下面跟帖留言,大家一起互幫互助。

論壇徽章:
15
2015年辭舊歲徽章
日期:2015-03-03 16:54:15雙魚座
日期:2015-01-15 17:29:44午馬
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉雞
日期:2014-04-02 12:24:51雙子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥豬
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大;照
日期:2013-04-17 11:48:45
2 [報(bào)告]
發(fā)表于 2012-08-10 09:41 |只看該作者
歡迎歡迎。多給大家回答回答就好。

論壇徽章:
5
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亞洲杯之朝鮮
日期:2015-03-13 22:47:33IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-09 06:20:00IT運(yùn)維版塊每周發(fā)帖之星
日期:2016-03-07 16:27:44
3 [報(bào)告]
發(fā)表于 2012-08-10 10:02 |只看該作者


首先,支持LZ的分享精神。

沒有仔細(xì)看完,寫的比較粗,有些地方?jīng)]有講清楚。

另外,最好排版好,這也是很重要的。

論壇徽章:
16
IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-10-02 06:20:00IT運(yùn)維版塊每月發(fā)帖之星
日期:2015-09-11 19:30:52IT運(yùn)維版塊每周發(fā)帖之星
日期:2015-09-11 19:20:31IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-26 06:20:00每日論壇發(fā)貼之星
日期:2015-08-20 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-20 06:20:002015年辭舊歲徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09雙子座
日期:2013-12-17 16:44:37辰龍
日期:2013-11-22 15:20:59獅子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
4 [報(bào)告]
發(fā)表于 2012-08-10 17:04 |只看該作者
看的暈乎乎的,明天看吧。今天整點(diǎn)別的。

論壇徽章:
3
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亞洲杯之阿曼
日期:2015-04-07 20:00:59
5 [報(bào)告]
發(fā)表于 2012-08-11 11:19 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-08-13 11:06 |只看該作者
本帖最后由 quanzhou722 于 2012-08-13 12:00 編輯

這個(gè)最后的 //D 真是不好理解。到底是匹配啥了?

  //D  是不是匹配到空行結(jié)束D命令?要不然有點(diǎn)解釋不通


論壇徽章:
16
IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-10-02 06:20:00IT運(yùn)維版塊每月發(fā)帖之星
日期:2015-09-11 19:30:52IT運(yùn)維版塊每周發(fā)帖之星
日期:2015-09-11 19:20:31IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-26 06:20:00每日論壇發(fā)貼之星
日期:2015-08-20 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-20 06:20:002015年辭舊歲徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09雙子座
日期:2013-12-17 16:44:37辰龍
日期:2013-11-22 15:20:59獅子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
7 [報(bào)告]
發(fā)表于 2012-08-21 11:28 |只看該作者
‘sed’先讀入‘1’,然后執(zhí)行‘N’,讀入‘2’。然后‘2D’,表示對(duì)第2行‘D’操作,這時(shí),確實(shí)sed已經(jīng)讀到第2行,所以‘2D’成功執(zhí)行把pattern space里‘1\n’給刪除了。然后,注意了啊,‘D’操作并沒有結(jié)束啊,pattern space還有‘2’呢,這時(shí)它繼續(xù)‘N’操作啊,這時(shí)把‘3’讀入(你可能會(huì)問,不是pattern space不為空,就不讀input嗎?你說的對(duì)啊,但是sed它確實(shí)沒有主動(dòng)讀入input啊,而是‘N’操作讀入了下一行,你把‘N’換成別的,那也就沒有input數(shù)據(jù)了。)。好了,繼續(xù)講。讀入‘3’后,到第三行了,‘2D’為假了,所以不執(zhí)行‘D’操作了,終于輪到‘p’操作了,這時(shí)pattern space的結(jié)果是不是‘2\n3’啊。接著,sed主動(dòng)讀入‘4’,然后執(zhí)行‘N’操作,發(fā)現(xiàn)沒有下一行了,出錯(cuò)了就直接跳到腳本末尾,所以‘p’操作都不執(zhí)行了。這樣,‘4’也打印不出了。不信的話,你試試下面的腳本就能打印出‘4’來了

你這里有個(gè)問題,當(dāng) 對(duì)第二行'D'操作后,后面不是還有個(gè)p嗎?應(yīng)該打印,怎么就直接又N了呢?

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-08-24 10:24 |只看該作者
D操作如果繼續(xù)執(zhí)行的話,是直接再去執(zhí)行“”里的腳本,‘D’后面的語句只有‘2D’不滿足條件時(shí)才能執(zhí)行。所以這個(gè)‘p’操作,再第一次并不能被執(zhí)行。我在‘()’里已經(jīng)說了。
回復(fù) 7# wenhq


   

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2012-08-24 10:26 |只看該作者
謝謝block哥支持。我重新修改下。
回復(fù) 3# blackold


   

論壇徽章:
3
酉雞
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亞冠之德黑蘭石油
日期:2015-08-03 11:14:27
10 [報(bào)告]
發(fā)表于 2014-12-15 12:34 |只看該作者
mark下
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP