第二个模式sed后删除行

时间:2013-10-01 20:47:02

标签: bash sed awk

我正在修剪一个文件,我需要在第二场比赛后删除所有内容(以及第一场比赛前的所有内容)。

比如说我有这样的文字:

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路,现在我想在第二场比赛后删除所有内容以获得此结果:

New USB device found
xxx xxx
yyy yyy
zzz zzz

因此只是第一个设备的数据。

4 个答案:

答案 0 :(得分:6)

这个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

答案 1 :(得分: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进行比较。这样,只需将NR==2更改为NR==112NR==4,即可打印第112条记录,就像打印第4条记录一样简单。

答案 2 :(得分:1)

这是一个sed解决方案:

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

答案 3 :(得分:1)

使用sed:

sed -n '/New/{:a;p;n; /New/!ba}' input