在Linux中搜索两个模式之间的文本,这两个模式可能在同一行上,也可能不在同一行上

在Linux中搜索两个模式之间的文本,这两个模式可能在同一行上,也可能不在同一行上,linux,awk,sed,Linux,Awk,Sed,我的文本文件如下所示: line 1: pattern 1 <some text> 2: <some text> 3: <some text> 4: <some text> 5: pattern 2 6: pattern 1 <some text><some text> pattern 2 (same line)

我的文本文件如下所示:

line 1: pattern 1 <some text>
         2:  <some text>
         3:  <some text>
         4:  <some text>
         5: pattern 2
         6: pattern 1 <some text><some text> pattern 2 (same line)       
         7: <some other text>
第1行:模式1
2:  
三:
4:  
5:模式2
6:模式1模式2(同一行)
7: 
我正在寻找一种优化的方法来获取模式1和模式2之间的文本条目


我想列出这些模式之间的文本。

使用awk

awk 'sub(/.*pattern 1/,""){on=1} sub(/pattern 2.*/,""){print; on=0} on;' yourfile
这两种情况都适用;对于您的文件示例,它会生成:

 <some text>
2:  <some text>
3:  <some text>
4:  <some text>
5: 
 <some text><some text>

2:  
三:
4:  
5: 

编辑问题以显示给定输入的预期输出。此外,在您的示例中,应该在一行中包含一个类似于
模式1模式2模式1模式2的案例,并使所有
占位符都是唯一的,这样当我们测试一个潜在的解决方案时,我们可以在输出中告诉这些块来自何处,以查看它是否正确。
/pattern 1/{gsub(/.*pattern 1/,“”);on=1}<代码> >子(/*模式1),{On=1 } <代码> >代码> {打印} /代码>=代码> < /代码>,并且如果您重新排列您的部分,将“<代码> > 中间,则不需要单独的<代码>打印< /代码>,在<代码> on=0 < /代码>块中,即<代码> AWK 'Sub(/*模式1 /)“{ON=1 }上;sub(/pattern 2.*/,“”){on=0}您的文件
。当上一个块的pattern2与下一个块的pattern1位于同一行时,它将失败。好的,我已经按照您的建议缩短了它。我在“on=0”之前没有删除print,因为这是使它在两种情况下都能工作的技巧。谢谢。不,请继续移动
是如何使它在这两种情况下都能工作。在{打印} /代码>中,将其作为<代码>。如果您愿意,但在终止条件的情况下,移动它并清除额外的<代码>打印< /代码>,这样您就不会从代码中的多个位置执行相同的操作(打印当前行)。如果我移动“on”;在中间,它打印“模式2”。在用空字符串替换它之前:
5:pattern 2
pattern 2
另外,我想等待询问者澄清问题..啊,好的观点。正确的编写方法是
sub(/.*pattern 1/,“”){on=1}{if(sub(/pattern 2.*/,“”)on=0;print}'
。是的,在发布答案之前,我也在等待对我在问题下的评论的回应——现在我们不知道老年退休金计划的真正要求是什么,我们都只是猜测。