我想选择两种模式之间的文本,当某些模式可以重复时如下。
这是输入:
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 位于不同的线路上。