昨天從老男孩架構師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/