我一直在读如何 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
,然后从输入中删除该行和以下两行。相对寻址是标准的+2
GNU扩展。sed
sed
使用 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