从给定的匹配中删除多行直到空行

问题描述 投票:0回答:3

在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
没有任何有用的结果,我无法弄清楚这个问题。

shell unix awk sed
3个回答
4
投票

你可能可以逃脱:

 awk '!/terminfo/' RS= ORS='\n\n' 

将 RS 设置为空字符串会导致

awk
将每个部分视为一条记录(“部分”表示由空行分隔的文本块,通常称为“段落”),因此您只需打印那些不包含的内容匹配字符串
terminfo
。 更准确地说,您可能需要使用:

awk '!/^Package: terminfo/' RS= ORS='\n\n'

但这似乎没有必要。


3
投票

您也可以使用

sed '/terminfo/,/^$/d'
。这将从包含
terminfo
的行中删除,直到找到空行。

有关处理多行的更多此类问题,请参阅如何打印两个模式之间的行,包括或排除(在 sed、AWK 或 Perl 中)?


0
投票
哎哟!

我知道您说的是 sed 和 awk,但是您会考虑 Perl 吗? 这是一个解决方案。 基本上将整个文件抓取到一个字符串中。 然后在该字符串中全局搜索

Package: terminfo

,后跟零个或多个单词,然后换行 1 次或多次,直到出现空行,然后将所有内容替换为空行。

您可以使用 -i 选项来修改原始文件,但这在测试过程中可能是一个坏主意。

#!/usr/bin/perl -w #remove all lines starting with Package: terminfo until blank line my $entireFile = do { local $/; <> }; #because there are newlines, I will read the entire file into a string $entireFile =~ s/(Package: terminfo(.*?\n)+\n)//g; print "$entireFile";
输出看起来像这样

$ perl removeTerminfo.pl terminfo.txt ... 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 ...
当您准备好创建删除了行的文件时,请尝试此操作

$ perl removeTerminfo.pl terminfo.txt > terminfoLinesRemoved.txt
打了 55 个角色的高尔夫球

perl -e 'local $/;$_=<>;s/(Package: terminfo(.*?\n)+\n)//g;print;' terminfo.txt > terminfoLinesRemoved.txt
    
© www.soinside.com 2019 - 2024. All rights reserved.