2015-05-29 45 views
0

說我們得到了一個示例文件:awk的排除範圍模式,但包括啓動模式

11 
12 
ss 
dd 
gg 
32 
ss 
dd 
gg 

所以我想刪除它滿足模式SS GG塊,但我想保持啓動模式SS

的出放應

11 
12 
ss 
32 
ss 

使用此代碼

awk '/ss/,/gg/{next}1' file 

它也不包括開始模式ss。我們怎麼能保留它?

回答

3

我會用一個打印標誌是這樣的:

$ awk '!flag; /ss/ {flag=1} /gg/ {flag=0}' file 
11 
12 
ss 
32 
ss 

此使用類似的邏輯How to select lines between two marker patterns which may occur multiple times with awk/sed,在某種程度上,使要打印的開始圖案移動所述標記。

  • !flag由於變量的默認值爲0,否定它使其成立。這樣,我們有一個默認True值,這會觸發awk的默認操作:print $0
  • /ss/ {flag=1}設置flag發現文本ss
  • /gg/ {flag=0}當發現文本gg時,取消設置flag
3

使用sed你可以這樣做:

sed '/ss/,/gg/{/ss/!d;}' file 
11 
12 
ss 
32 
ss 

sed將刪除模式ssgg除非線是ss使用!d命令行。

+1

這很酷,做得很好! – fedorqui