使用例如:
grep -A 1 'hello' filename.c
将返回filename.c中任何' hello' -match的行和前一行
但现在我想取消选择,所以我尝试了:
grep -v -A 1 'hello' filename.c
这并不令我惊讶(它只返回完整的filename.c文件)
第一个问题:这是为什么? 第二个更重要的问题:grep(或sed)是否有可能取消选择上一行和/或下一行,就像我尝试使用grep和-v结合使用例如-A 1,-B 3或-C 2?建议?
答案 0 :(得分:0)
这是一个通用的解决方案:
awk '{a[NR]=$0} $0~s {f=NR} END {for (i=1;i<f-B;i++) print a[i];for (i=f+A+1;i<=NR;i++) print a[i]}' B=2 A=1 s="pattern" file
示例:
cat file
one
two # 2 before
three # 1 before
four # pattern
five # 1 after
six
seven
eight
删除模式four
awk '{a[NR]=$0} $0~s {f=NR} END {for (i=1;i<f-B;i++) print a[i];for (i=f+A+1;i<=NR;i++) print a[i]}' B=2 A=1 s="four" file
one
six
seven
eight
PS这只适用于pattern
的一次点击,但对于数组,它可以添加更多
当数据组开始重叠时,问题就开始了。