根据其他行从文件中检索行

hal*_*000 3 grep sed awk text-processing

想象一下以下文件结构:

foo.bar.1
blabla
moreblabla
relevant=yes
foo.bar.2
relevant=no
foo.bar.3
blablabla
foo.bar.4
relevant=yes
Run Code Online (Sandbox Code Playgroud)

我想检索foo.bar在块内跟随自己并且在下一个之前foo.bar有一行声明的所有行relevant=yes

所以输出应该是:

foo.bar.1
foo.bar.4
Run Code Online (Sandbox Code Playgroud)

我当然可以编写一个程序/脚本遍历这些行,记住foo.bars并在有一行说relevant=yes在它们之后和下一个之前打印它们foo.bar。但我认为使用标准 Unix 实用程序 (grep/sed/awk)可能有一种开箱即用的方式?

感谢任何提示!

Gil*_*il' 5

如果输入是逐行处理的,那么处理需要像这样:

  • 如果当前行是foo.bar,则存储它,忘记任何foo.bar未启用输出的前一行;
  • 如果当前行是relevant=yes,这将启用最新foo.bar的输出。

这种推理是 awk 的工作。(如果你喜欢痛苦,也可以在 sed 中完成。)

awk '
    /^foo\.bar/ { foobar = $0 }
    /^relevant=yes$/ {if (foobar != "") {print foobar; foobar = ""}}
'
Run Code Online (Sandbox Code Playgroud)