我正在努力解决这个任务。我想从以下输出中排除所有包含的行Auto-installed: 1和之前的 2 行。我天真地认为这grep -v -B2 string会解决问题……不用说,只会让事情变得更糟。
这是内容:
Package: libopencore-amrwb0
Architecture: amd64
Auto-Installed: 1
Package: transfig
Architecture: amd64
Auto-Installed: 0
Package: xfig-libs
Architecture: amd64
Auto-Installed: 1
Package: xaw3dg
Architecture: amd64
Auto-Installed: 0
Run Code Online (Sandbox Code Playgroud)
这就是结果的样子:
Package: transfig
Architecture: amd64
Auto-Installed: 0
Package: xaw3dg
Architecture: amd64
Auto-Installed: 0
Run Code Online (Sandbox Code Playgroud)
(注意,不显示空行,如果不显示空行是一个加号但不是必需的,结果还应包括自动安装值为 0 的包)
我知道我可以匹配换行符,但要么不打印任何内容,要么打印所有内容,但换行符介于两者之间。
任何解决方案都是可以接受的,它不必是 grep (它甚至可以是 emacs)。
我不确定您的数据的结构如何,但如果正如您所展示的那样,以下内容如何:
grep -B2 'Auto-Installed: [^1]'
Run Code Online (Sandbox Code Playgroud)
假设每个节都包含Auto-Installed一行,这可能不正确。
这是一个 awk 程序,我认为它完全按照您的要求执行。
awk 'BEGIN{deleted=3}
!deleted{printf "%s",l[NR%3]}
deleted {--deleted}
{l[NR%3]=/./?$0"\n":$0}
/Auto-Installed: 1/{deleted=3}
END{for(i=NR+deleted;i<NR+3;++i)printf "%s",l[i%3]}'
Run Code Online (Sandbox Code Playgroud)