如何“grep -v”并在匹配后排除“n”行?

如何“grep -v”并在匹配后排除“n”行?

我一直在读如何 grep -v 并在匹配后排除下一行?sed并想知道如何使用或任何其他实用工具排除这 2 条线或比赛后的任何数字。

user@linux:~$ cat -n file.txt 
     1  SomeTestAAAA
     2  Random String
     3  EndTest
     4  SomeTestABCD
     5  Random String
     6  EndTest
     7  SomeTestDEFG
     8  Random String
     9  EndTest
    10  SomeTestAABC
    11  Random String
    12  EndTest
    13  SomeTestACDF
    14  Random String
    15  EndTest
user@linux:~$ 

第一个问题

我能够使用grep -P以下方法完成此操作:不幸的是,--输出中存在不需要的字符。

如何删除这个?

user@linux:~$ grep -P -A 2 'SomeTest(?!AA)' file.txt
SomeTestABCD
Random String
EndTest
SomeTestDEFG
Random String
EndTest
--
SomeTestACDF
Random String
EndTest
user@linux:~$ 

问题2

我也成功地做到了这一点,awk如之前的答案所示。然而,由于相似的模式,这只适用于这种情况EndTest。如果EndTest是一些随机单词并且没有模式怎么办?

我们可以做类似的事情吗grep -v -A 2 SomeTestAA?我知道这行不通,但所需的输出将类似于以下内容。

user@linux:~$ awk  'BEGIN{ RS=ORS="\nEndTest\n"} !/'"^SomeTestAA/" file.txt 
SomeTestABCD
Random String
EndTest
SomeTestDEFG
Random String
EndTest
SomeTestACDF
Random String
EndTest
user@linux:~$ 

答案1

使用 GNU sed

$ sed '/AA/,+2d' <file
SomeTestABCD
String
EndTest
SomeTestDEFG
String
EndTest
SomeTestACDF
String
EndTest

GNUsed脚本查找包含该字符串的行AA,然后从输入中删除该行和以下两行。相对寻址是标准的+2GNU扩展。sedsed

使用 standard sed,删除两行:

sed -n '/AA/{n;n;d;}; p' <file

这使用sed时不会隐式输出每一行输入(带有-n)。当AA模式匹配时,将显式读取并删除接下来的两行。所有不触发图案的行都将被打印。

使用 standard sed,删除该EndTest行:

sed '/AA/,/^EndTest$/d' <file

这将删除从包含该字符串的行AA到紧随该模式的下一行的所有行^EndTest$


用于awk忽略匹配后的两行AA

awk '/AA/ { getline; getline; next } 1' <file

使用方式awk与最后一个sed变体相同:

awk '/AA/,/^EndTest$/ { next } 1' <file

相关内容