分析一例sed循環實例

昨天從老男孩架構師QQ羣中,看到一個網友提出以下問題:

[root@lamp tools]# cat test.txt 
type {
sfjslkfjslfjslf
lsjflsfjslfjs
sljfslfjslf
}aa
type {
sfkhsfkshf
141414lsjflsfjmb
s474ljfslfjslfm54
}bb
type {
098dgs
vnxvsb
zczgmvs
}cc
type {
blddgdlgj
d;gkdgkd
lkdjgld
}bb

只打印type {......}bb內容,答案如下sed -n '/type/{:a;N;/\}/{/bb/{p;b};d};ba }' test.txt,讓其他朋友給分析下,我的分析如下:

讀取第1行type { ,開始執行,匹配到/type/,定義a:進入循環

讀取第2行,此時模式空間內容如下:

type {\nsfjslkfjslfjslf

提示:/\}/{/bb/{p;b};d}匹配到“}”後採取的動作,讀取第2行後,沒有匹配“}”,則往下執行ba,跳回a:後繼續執行N

讀取第3行,此時模式空間內容如下:

type {\nsfjslkfjslfjslf\n lsjflsfjslfjs

讀取第4行,此時模式空間內容如下:

type {\nsfjslkfjslfjslf\n141414lsjflsfjmb\nsljfslfjslf

讀取第5行,}aa,匹配到“}”,執行{/bb/{p;b};d}

/bb/{p;b}是否匹配bb,因爲是aa,所以沒有匹配bb,那麼執行d,清空模式空間內容,從頭開始執行

步驟省略...

type {\nsfkhsfkshf\n141414lsjflsfjmb\ns474ljfslfjslfm54

此時讀到“}bb”,匹配“}”,並且匹配bb,p打印模式空間內容,並清空模式空間

type {\nsfkhsfkshf\n141414lsjflsfjmb\ns474ljfslfjslfm54\n}bb

打印模式空間後,執行b,忽略之後的命令行,從頭開始

...

...

最後打印出所有type {......}bb的內容

type {

sfkhsfkshf

141414lsjflsfjmb

s474ljfslfjslfm54

}bb

type {

blddgdlgj

d;gkdgkd

lkdjgld

}bb

這條命令可以做如下精簡:

[root@lamp tools]# sed -n '/type/{:a;N;/\}/{/bb/p;d};ba }' test.txt     
type {
sfkhsfkshf
141414lsjflsfjmb
s474ljfslfjslfm54
}bb
type {
blddgdlgj
d;gkdgkd
lkdjgld
}bb

感謝老男孩教育給網友提供QQ交流羣平臺,www.oldboyedu.com

感謝51cto網友給出的分析思路http://asmboy001.blog.51cto.com/340398/184111/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章