假设我有一个文本文件为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?
答案 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
并再次测试,否则打印出来。