删除第二个模式 SED 之后的线条



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

例如,假设我有以下文本:

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

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

这个尴尬的单行本应该给出你想要的:

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

如果您有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 条记录就像打印第 4 条记录一样简单,只需将NR==2更改为 NR==112NR==4 即可。

这是一个 sed 解决方案:

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

使用 sed:

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

最新更新