如何使用sed在两个模式之间进行匹配,并在第二个模式之后获得下一行?

如何使用sed在两个模式之间进行匹配,并在第二个模式之后获得下一行?,sed,Sed,我熟悉使用sed来获取两种模式之间的界限。例如: $ cat file A PATTERN1 B PATTERN2 C $ sed -n '/PATTERN1/,/PATTERN2/p' file PATTERN1 B PATTERN2 但是,我想做的是生成以下输出: PATTERN1 B PATTERN2 C 我曾经遇到过{n;p}语法(),但我似乎无法将其应用到我在这个示例问题中正在进行的模式匹配类型中。这可能适用于您(GNU-sed): 备选方案: sed '/PATTERN1/{:a

我熟悉使用sed来获取两种模式之间的界限。例如:

$ cat file
A
PATTERN1
B
PATTERN2
C
$ sed -n '/PATTERN1/,/PATTERN2/p' file
PATTERN1
B
PATTERN2
但是,我想做的是生成以下输出:

PATTERN1
B
PATTERN2
C
我曾经遇到过{n;p}语法(),但我似乎无法将其应用到我在这个示例问题中正在进行的模式匹配类型中。

这可能适用于您(GNU-sed):

备选方案:

sed '/PATTERN1/{:a;n;/PATTERN2/!ba;n;p};d' file

您可以使用
N
(此处的语法基于
GNU sed


使用
awk

$ awk '/PATTERN1/{f=1} f || (c && c--); /PATTERN2/{f=0; c=1}' ip.txt
PATTERN1
B
PATTERN2
C
您可以使用以下方法对其进行概括:

awk -v n=2 '/PATTERN1/{f=1} f || (c && c--); /PATTERN2/{f=0; c=n}'

进一步阅读:


sed-En'/PATTERN1 | PATTERN2/{N;p}文件
?@Cyrus有趣的把戏。。只有在两个标记之间没有线时才会失败。。。如果
PATTERN1
PATTERN2
之间有多行,则会失败。它只适用于所描述的一种特定情况。
$ awk '/PATTERN1/{f=1} f || (c && c--); /PATTERN2/{f=0; c=1}' ip.txt
PATTERN1
B
PATTERN2
C
awk -v n=2 '/PATTERN1/{f=1} f || (c && c--); /PATTERN2/{f=0; c=n}'