2

ファイルをトリミングしようとしていますが、2 番目の一致の後 (および最初の一致の前のすべて) をすべて削除する必要があります。

たとえば、次のテキストがあるとします。

xxx xxx
yyy yyy
New USB device found
xxx xxx
yyy yyy
zzz zzz
New USB device found
xxx xxx
yyy yyy

sed次のコマンドを使用する場合:

sed -i '1,/New USB device found/d' <FILE>  

これにより、最初の一致の前にすべてが削除されます。これは素晴らしいです:

New USB device found
xxx xxx
yyy yyy
zzz zzz
New USB device found
xxx xxx
yyy yyy

しかし、私はそこに 1/2 の方法しかありません。今、この結果を得るために、2 番目の試合の後にすべてを削除したいと考えています。

New USB device found
xxx xxx
yyy yyy
zzz zzz

したがって、最初のデバイスのデータだけです。

4

4 に答える 4

8

この awk ワンライナーは、あなたが望むものを与えるはずです:

awk '/New USB device found/{p++}p==1' file

あなたのデータでテストしてください:

kent$  awk '/New USB device found/{p++}p==1' file
    New USB device found
    xxx xxx
    yyy yyy
    zzz zzz
于 2013-10-01T20:52:19.937 に答える
2

あなたが持っているGNU awk場合:

$ awk 'NR==2{print RS,$0}' RS='New USB device found' file
New USB device found 
xxx xxx
yyy yyy
zzz zzz

印刷したいレコード番号を比較するだけですNR。これにより、112 番目のレコードを、またはに変更NR==2するだけで 4 番目のレコードを印刷するのと同じくらい簡単に印刷できます。 NR==112NR==4

于 2013-10-01T20:53:57.680 に答える
1

sed ソリューションは次のとおりです。

sed -i '1,/New USB device found/d; /New USB device found/,$d' <FILE>
于 2013-10-01T21:17:12.653 に答える
1

sedを使用:

sed -n '/New/{:a;p;n; /New/!ba}' input
于 2013-10-01T21:19:33.610 に答える