删除匹配行之前的 X 行和 Y 行

Ita*_*ham 3 freebsd text-processing

我有以下字符串:

core1@pci0:2:0:1:  class=0x020000 rev=0x00 hdr=0x00 vendor=0x1453
    vendor     = 'MicSystem'
    device     = 'controller'
    class      = network
    subclass   = ethernet
none65@pci0:2:0:2:      class=0x080100 rev=0x00 hdr=0x00 vendor=0x1453
    vendor     = 'MicSystem'
    device     = 'interface'
    class      = base peripheral
    subclass   = DMA controller
core1@pci0:2:0:1:  class=0x020000 rev=0x00 hdr=0x00 vendor=0x1453
    vendor     = 'MicSystem'
    device     = 'controller'
    class      = network
    subclass   = ethernet
Run Code Online (Sandbox Code Playgroud)

我必须在 where 'class = baseperipheral' 之前删除 3 行和之后 1 行,例如:

core1@pci0:2:0:1:  class=0x020000 rev=0x00 hdr=0x00 vendor=0x1453
    vendor     = 'MicSystem'
    device     = 'controller'
    class      = network
    subclass   = ethernet
core1@pci0:2:0:1:  class=0x020000 rev=0x00 hdr=0x00 vendor=0x1453 
    vendor     = 'MicSystem'
    device     = 'controller'
    class      = network
    subclass   = ethernet
Run Code Online (Sandbox Code Playgroud)

我没有设法做到这一点,这是在 FreeBSD 操作系统中完成的。

Qua*_*odo 5

实际使用Ed或Ex:

ed -s file <<EOF
g/base peripheral/-3;+4d
%p
EOF
Run Code Online (Sandbox Code Playgroud)
printf '%s\n' 'g/base peripheral/-3;+4d' '%p' | ex -s file
Run Code Online (Sandbox Code Playgroud)

该g叶形标记与“基地周”的所有行和deletes给定范围内。然后%p打印文件。您可以使用w来保存对文件的更改。