打印包含一组模式的段落(出现顺序无关紧要)

Print paragraphs that contain a set of patterns (order of occurrence doesn't matter)

给定一组模式 A = {a_1, a_2, ..., a_n},我想打印包含所有这些模式的段落:a_1a_2、...、a_n

假设我有以下文件

$ cat main.txt
a

b

c

a
b

b
c

c
a

a
b
c

我想打印所有包含以下模式的段落:\<a\>\<b\>\<c\>。也就是说,输出应该是

$ {some command here}
a
b
c

我写了下面的命令。但是,这会将那些仅包含空格或制表符的行视为段落的一部分(回想一下,仅包含空格的行不能被视为段落的一部分)。我认为这可以通过执行 awk 一次来改善。

$ awk -v RS= '/\<a\>/ {print [=12=],"\n"}' main.txt |\
  awk -v RS= '/\<b\>/ {print [=12=],"\n"}' |\
  awk -v RS= '/\<c\>/ {print [=12=]}'

a
b
c

是否有更有效的方法来实现这一目标?

您必须为空 RS:

准备输入
awk '!NF{[=10=]=""}1' main.txt > input.txt

这样,没有空白 (non-empty) 行将被视为段落的一部分,并且您消除了这些空白成为您的模式之一的可能性。实际上很难成为模式的一部分(但并非不可能),但是统一段落是很有可能的,所以这个输入"a\n \nb\n\c"将被认为是一个匹配所有模式的段落。


当然,您必须 运行 awk 一次来测试每个段落的所有模式。但是,即使像现在这样一次一次,如果您准备好输入,它也会起作用。

awk -v RS= '/\<a\>/ && /\<b\>/ && /\<c\>/{print [=11=],"\n"}' input.txt