2015-05-29 75 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