查找发生在pattern1和pattern2之间的pattern3,并使用sed或awk返回pattern1和pattern2之间的所有线

查找发生在pattern1和pattern2之间的pattern3,并使用sed或awk返回pattern1和pattern2之间的所有线,awk,sed,grep,Awk,Sed,Grep,================文件从这里开始============= 模式1: 图案 图案B 图案 图案 图案 图案 模式2 模式1: 图案 图案B 图案 图案 图案 图案 模式2 模式1: 图案 图案B 图案 图案 图案 图案 模式2 模式1: 图案 图案B 图案 图案 图案 图案 模式2 模式1: 图案 图案B 图案 图案 图案 图案 模式2 ================文件到此结束============= 现在我要搜索的模式是pattern_pat;我需要打印pattern1和p

================文件从这里开始=============

模式1:

图案

图案B

图案

图案

图案

图案

模式2

模式1:

图案

图案B

图案

图案

图案

图案

模式2

模式1:

图案

图案B

图案

图案

图案

图案

模式2

模式1:

图案

图案B

图案

图案

图案

图案

模式2

模式1:

图案

图案B

图案

图案

图案

图案

模式2

================文件到此结束=============

现在我要搜索的模式是pattern_pat;我需要打印pattern1和pattern2之间包含pattern_pat的所有行。像下面

=============输出文件=============

模式1:

图案

图案B

图案

图案

图案

图案

模式2

模式1:

图案

图案B

图案

图案

图案

图案

模式2

我是awk和sed的新手。因此,任何关于这方面的帮助都将是巨大的

awk -vRS='pattern1:' '/pattern_pat/&&/pattern2/{printf "%s %s",RT,$0}' file
塞德

使用awk(便携式,应与任何POSIX awk配合使用):


此版本使用两个变量作为标志。当我们在pattern1…pattern2组中时,变量
f
为真(
1
)。变量
g
为真(
1
),如果我们在该组中看到
模式。每当我们到达pattern2时,如果
f
g
都是真的,我们就打印组。

非常感谢。这是预期的工作。如果搜索模式中有前斜杠怎么办???@rajaswisaka如果
pattern1
包含一个
/
,然后将
/pattern1/
替换为
\\pattern1
\\pattern1
或选择另一个不在
pattern1
中的字符。在awk解决方案中,没有提到可能导致误报的
pattern2
sed -n '/pattern1:/{:a;N;/pattern2/!ba;/pattern_pat/p}' file
$ awk ' f{s=s ORS $0}; /pattern1/{s=$0; f=1; g=0}; f && /pattern_pat/{g=1}; f && g && /pattern2/{print s; f=0}' file
pattern1:
patterna
patternb
pattern_pat
patternc
patternd
patterne
pattern2
pattern1:
patterna
patternb
pattern_pat
patternc
patternd
patterne
pattern2