当模式重复时,使用 sed 选择两个模式之间的文本

当模式重复时,使用 sed 选择两个模式之间的文本

我想选择两种模式之间的文本,当某些模式可以重复时如下。

这是输入:

Blalala
PAT1
'Omfoem From 
balanf PAT1 This is the
text that I want
to get PAT2: apples
Whatever: oranges

这是我想要的输出:

This is the
text that I want
to get

我尝试过使用这个脚本(我正在使用 OSX):

gsed -e 's/PAT1/\nPAT1\n/' -e 's/PAT2/\nPAT2\n/' file1.txt | sed -n '/PAT1/,/PAT2/{//!p;}'

但它输出以下内容:

'Omfoem From 
balanf 
PAT1
This is the
text that I want
to get 

在这种特殊情况下,我可以sed -n '/PAT1/,/PAT2/{//!p;}'第二次应用,我会得到正确的输出。

但是,我正在寻找一个适用于不同情况的脚本:是否重复任何模式(与次数无关),以及是否根本不重复该模式。

在任何这些情况下,我希望能够在 PAT1 和 PAT2 彼此最接近时提取模式 PAT1 和 PAT2 之间的文本。

答案1

一种方法可能是 ( POSIX sed):

$ sed -e '
   /PAT1/,/PAT2/!d
   H;/PAT1/h;/PAT2/!d;g
   s/PAT2.*//;s/.*PAT1//
' file

假设 PAT1 和 PAT2 位于不同的线路上。

相关内容