如果模式中包含patternC,则从patternA删除到patternB

时间:2016-11-23 07:34:51

标签: awk sed

示例输入

patternA
patternD
patternE
patternB
patternA
patternD
patternC
patternB

输出应为

patternA
patternD
patternE
patternB

第{{}}}块被删除,因为它包含patternA.....patternB

2 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed '/patternA/!b;:a;N;/patternB/!ba;/patternC/d' file

在遇到patternA之前忽略任何行。收集后续行,直到文件结束或遇到patternB。如果收集的行包含patternC,则删除所有内容,否则打印正常并重复。

答案 1 :(得分:0)

$ awk '/patternA/{f=1; a = $0; next} f{a = a ORS $0} /patternB/{f=0; if(a !~ /patternC/) print a}' file
patternA
patternD
patternE
patternB
  • 分别设置和取消设置开始和结束模式的标志
  • 设置标志时,在变量a
  • 中累积输入行
  • 如果未设置标记,则打印a的内容(如果它不包含patternC


如果输入文件包含应打印的其他行,例如:

$ cat file 
foo
patternA
patternD
patternE
patternB
patternA
patternD
patternC
patternB
patternA
pattern1
patternB
bar
baz

然后使用:

$ awk '/patternA/{f=1; a = $0; next} f{a = a ORS $0} /patternB/{f=0; if(a !~ /patternC/) print a; next} !f' file 
foo
patternA
patternD
patternE
patternB
patternA
pattern1
patternB
bar
baz