使用grep -v -A 1取消选择前一行

时间:2015-03-14 10:23:26

标签: grep

使用例如:

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?建议?

1 个答案:

答案 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的一次点击,但对于数组,它可以添加更多 当数据组开始重叠时,问题就开始了。