私は読んでいた一致した後に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