在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='\n\n'
将 RS 设置为空字符串会导致
awk
将每个部分视为一条记录(“部分”表示由空行分隔的文本块,通常称为“段落”),因此您只需打印那些不包含的内容匹配字符串 terminfo
。 更准确地说,您可能需要使用:
awk '!/^Package: terminfo/' RS= ORS='\n\n'
但这似乎没有必要。
您也可以使用
sed '/terminfo/,/^$/d'
。这将从包含 terminfo
的行中删除,直到找到空行。
有关处理多行的更多此类问题,请参阅如何打印两个模式之间的行,包括或排除(在 sed、AWK 或 Perl 中)?。
我知道您说的是 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