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

Shell 打印包含一组模式的段落(出现顺序无关紧要),shell,awk,text-processing,Shell,Awk,Text Processing,给定一组模式a={a_1,a_2,…,a_n},我想打印包含所有这些模式的段落:a_1,a_2,…,a_n 段落以非空白字符开头,以仅包含空白字符的行结尾 模式在段落中出现的顺序并不重要 假设我有以下文件 $ cat main.txt a b c a b b c c a a b c 我想打印包含以下模式的所有段落:\,\,\。也就是说,输出应该是 $ {some command here} a b c 我已经编写了以下命令。但是,考虑到这些段落只包含一个段落的空间或制表符(请

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

  • 段落以非空白字符开头,以仅包含空白字符的行结尾
  • 模式在段落中出现的顺序并不重要
假设我有以下文件

$ cat main.txt
a

b

c

a
b

b
c

c
a

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
$awk-vrs='/\/{print$0,“\n”}”main.txt|\
awk-v RS='/\/{print$0,“\n”}”|\
awk-v RS='/\/{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
awk-vrs='/\/&&/\/&&/\/{print$0,“\n”}”input.txt

请将单词
模式
替换为
字符串
regexp
,无论您指的是哪一个,只要出现在您的问题中。单词
模式
模棱两可,因此在我们知道您的实际需求(字符串或regexp匹配)之前,很容易建议错误的方法。还可以将
a
等更改为更具代表性的字符串,这些字符串包括regexp元字符、其他字符串的子字符串等。因此,我们有一些有用的内容可供测试。