打印包含一组模式的段落发生顺序无关紧要

问题描述

给出一组模式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 $0,"\n"}' main.txt |\
  awk -v RS= '/\<b\>/ {print $0,"\n"}' |\
  awk -v RS= '/\<c\>/ {print $0}'

a
b
c

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

解决方法

您必须为空的RS准备输入内容:

awk '!NF{$0=""}1' main.txt > input.txt

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


当然,您必须运行一次awk才能一起测试每个段落的所有模式。但是,即使您现在准备一次输入一次,它也可以工作,只要准备输入即可。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...