在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脚本中使用此功能,我尝试过使用sed
和awk
,没有有用的结果,我无法解决这个问题。
你可以这样写:
awk '!/terminfo/' RS= ORS='nn'
将RS设置为空字符串将导致awk
将每个节视为一条记录("节"意思是由空行分隔的文本块,通常称为"段落",因此只需打印与字符串terminfo
不匹配的部分。更精确地说,您可能想使用:
awk '!/^Package: terminfo/' RS= ORS='nn'
但这似乎没有必要。
您也可以使用sed '/terminfo/,/^$/d'
。这将从包含terminfo
的行中删除,直到找到空行。
参见如何打印包含或不包含的两个模式之间的行(在sed, AWK或Perl中)?对于更多这样的问题,处理多行。