从给定匹配中删除多行,直到出现空行

  • 本文关键字:删除 shell unix awk sed
  • 更新时间 :
  • 英文 :


在unix系统上,我有一个文件,我需要删除所有与Package: <PKG_NAME>匹配的行,直到找到空行。下面是一个例子,我需要删除terminfo信息:

...
Package: kmod-usb-storage
Version: 5.4.218-1
Depends: kernel (= 5.4.218-1-0c02597a113d34441a9bfe9294e3fb84), kmod-scsi-core, kmod-usb-core
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667822688
Auto-Installed: yes
Package: terminfo
Version: 6.2-1
Depends: libc
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667816896
Package: libuci-lua
Version: 2020-10-06-52bbc99f-5
Depends: libc, libuci20130104, liblua5.1.5
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667816896
Auto-Installed: yes
...

之后我需要没有关于terminfo的信息:

...
Package: kmod-usb-storage
Version: 5.4.218-1
Depends: kernel (= 5.4.218-1-0c02597a113d34441a9bfe9294e3fb84), kmod-scsi-core, kmod-usb-core
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667822688
Auto-Installed: yes
Package: libuci-lua
Version: 2020-10-06-52bbc99f-5
Depends: libc, libuci20130104, liblua5.1.5
Status: install user installed
Architecture: mips_24kc
Installed-Time: 1667816896
Auto-Installed: yes
...

我会在shell脚本中使用此功能,我尝试过使用sedawk,没有有用的结果,我无法解决这个问题。

你可以这样写:

 awk '!/terminfo/' RS= ORS='nn' 

将RS设置为空字符串将导致awk将每个节视为一条记录("节"意思是由空行分隔的文本块,通常称为"段落",因此只需打印与字符串terminfo不匹配的部分。更精确地说,您可能想使用:

awk '!/^Package: terminfo/' RS= ORS='nn'

但这似乎没有必要。

您也可以使用sed '/terminfo/,/^$/d'。这将从包含terminfo的行中删除,直到找到空行。

参见如何打印包含或不包含的两个模式之间的行(在sed, AWK或Perl中)?对于更多这样的问题,处理多行。

相关内容

  • 没有找到相关文章

最新更新