如何打印所有不包含字符串的行以及相邻行?

Bra*_*iam 4 text-processing

我正在努力解决这个任务。我想从以下输出中排除所有包含的行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)。

ric*_*ici 6

我不确定您的数据的结构如何,但如果正如您所展示的那样,以下内容如何:

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)