![「grep -v」を実行し、一致後に「n」行を除外する方法は? [コピー]](https://linux33.com/image/11777/%E3%80%8Cgrep%20-v%E3%80%8D%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%80%81%E4%B8%80%E8%87%B4%E5%BE%8C%E3%81%AB%E3%80%8Cn%E3%80%8D%E8%A1%8C%E3%82%92%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
私は読んでいた一致した後に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行を削除します。相対アドレス指定は標準の+2
GNU拡張です。sed
sed
Standardを使用してsed
2行を削除します。
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