「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からその行と次の2行を削除します。相対アドレス指定は標準の+2GNU拡張です。sedsed

Standardを使用してsed2行を削除します。

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

これは、入力のすべての行を暗黙的に出力せずに使用されますsed-n)。パターンが一致すると、AA次の2行を明示的に読み取り、削除します。パターンをトリガーしないすべての行が印刷されます。

Standard を使用してsed次のEndTest行を削除します。

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

これにより、文字列を含む行からパターンのAA直後の行まで、すべての行が削除されます^EndTest$


awk一致後に2行を無視するために使用されますAA

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

使用法はawk最後のsedバリエーションと同じです。

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

関連情報