如何 grep -v 并在匹配后排除下一行?

如何 grep -v 并在匹配后排除下一行?

如何为匹配 grep 正则表达式的每行过滤出 2 行?
这是我的最小测试:

SomeTestAAAA
EndTest
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestAABC
EndTest
SomeTestACDF
EndTest

显然我尝试过,例如,grep -vA 1 SomeTestAA这不起作用。

期望的输出是:

SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest

答案1

您可以grep-P(PCRE) 一起使用:

grep -P -A 1 'SomeTest(?!AA)' file.txt

(?!AA)是零宽度负先行模式,确保没有AAafter SomeTest

测试 :

$ grep -P -A 1 'SomeTest(?!AA)' file.txt 
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest

答案2

您可以使用 GNUsedd命令删除一行,并在其前面添加前缀以/pat/,+N选择与模式匹配的行以及后续的行线。就你而言,= 1 因为您只想删除匹配行之后的单个后续行:

sed -e '/SomeTestAAAA/,+1d'

答案3

尝试使用下面的 GNUsed命令,效果很好

命令

sed  '/SomeTestAA/,+1d' filename

输出

SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest

答案4

一种选择是使用perlc兼容的regular expression grep

pcregrep -Mv 'SomeTestAA.*\n' file

该选项-M允许模式匹配多于一行。

相关内容