awk排除范围模式但包括起始模式

时间:2015-05-29 11:27:03

标签: bash awk pattern-matching

假设我们有一个示例文件:

mov dl, [rax]
mov [rbx], dl

所以我想删除符合模式ss gg的块,但我想保留启动模式ss

输出应该是

rbx

使用此代码

rcx

它还排除了起始模式11 12 ss dd gg 32 ss dd gg 。我们怎么能保留它?

2 个答案:

答案 0 :(得分: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}后,
  • flag取消设置gg

答案 1 :(得分:3)

使用sed即可:

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

sed删除了从模式ssgg的所有行,除非使用ss命令行!d

相关问题