在两次出现的REGEX之间打印行

时间:2014-03-14 09:46:55

标签: shell unix sed awk grep

假设我有一个文本文件为Follows

candy_box a
orange
blue
red
sweet_box a
Jelly1
jelly2
poison_box c
12a
b154
Kl213
chox_box a
Snickers;
MARS
poison_box c
k121238
asf12
as3124

我的脚本应该像这样输出(避免box C及其内容)

candy_box a
orange
blue
red
sweet_box a
Jelly1
jelly2
chox_box a
Snickers;
MARS

我尝试grep "box c"并避免使用Sed后面的行。但问题是我在框c中有不同的内容。即一些盒子c内容有3行,有些有4行。

那么,我们怎样才能在同一个REGEX的两次出现和在它们之间包含的行中执行文本操作之间进行grep?

4 个答案:

答案 0 :(得分:0)

awk可以很方便:

$ awk 'NF==2 {if (/box c$/) {f=0} else {f=1}} f' file
candy_box a
orange
blue
red
sweet_box a
Jelly1
jelly2
chox_box a
Snickers;
MARS

解释

  • NF==2 {if (/box c$/) {f=0} else {f=1}}如果有两个字段,请执行以下操作:
    • if (/box c$/) {f=0}如果字符串以box c结尾,则关闭标记。
    • 否则,切换开关标志。
  • f如果为true,则会执行默认的awk行为 - > {print $0}

答案 1 :(得分:0)

这是awk

awk '/box c/{f=1;next} /box/{f=0} !f' file
candy_box a
orange
blue
red
sweet_box a
Jelly1
jelly2
chox_box a
Snickers;
MARS

高尔夫球解决方案fedorqui发布了

awk 'NF==2 {f=/box c$/?0:1} f' file
candy_box a
orange
blue
red
sweet_box a
Jelly1
jelly2
chox_box a
Snickers;
MARS

如果数据确实包含两个字段的行,则上述解决方案将失败 这可能是一种更好的方法。

awk '/box/ {f=/box c/?0:1} f'

awk '/_box [a-z]*/ {f=/box c/?0:1} f' 

答案 2 :(得分:0)

awk '/_box .$/{p=1}/_box c$/{p=0}p' file
candy_box a
orange
blue
red
sweet_box a
Jelly1
jelly2
chox_box a
Snickers;
MARS

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -n ':a;/box c/I{:b;n;/box/ba;bb};p' file

如果是包含box c的一行,请继续阅读下一行box并再次测试,否则打印出来。