如何打印最后出现的一对模式之间的文本?

如何打印最后出现的一对模式之间的文本?

我正在尝试使用 sed 将最后一次出现的两个模式之间的行打印到另一个文件中。例如,如果 file1 包含以下内容:

StartPattern
1
2
3
EndPattern
4
5
StartPattern
6
7
8
EndPattern
9
10
StartPattern
11
12
13
EndPattern
14
15

我希望输出是:

11
12
13

我怎样才能用 sed 做到这一点?

答案1

与单awk过程:

awk '/StartPattern/{ f=1;r=""; next }f && /EndPattern/{f=0}
     f{ r=(r=="")? $0: r RS $0 }END{ print r }' file > output

output文件内容:

11
12
13

选择塔克+awk解决方案:

tac file | awk '/StartPattern/{exit}/EndPattern/{f=1;next}f' | tac > output

答案2

cat file |sed -n 'H; /^StartPattern/h; ${g;p;}' |sed -e '1d' -e '/EndPattern/q' |sed '$ d'

答案3

文件包含:Patern1 line1 line2 .. linen Patern1 line1 line2 .. linen Patern1 line1 line2 .. linen Patern1 line1 line2 .. linen Patern2

图案 1 线条 1 线条 2 .. 亚麻图案 1 线条 1 线条 2 .. 亚麻图案 1 线条 1 线条 2 .. 亚麻图案 1 线条 1 线条 2 .. 亚麻图案 2 图案 1 线条 1 线条 2 .. 亚麻图案 1 线条 1 线条 2 .. 亚麻图案 1 线条 1 线条 2 .. 亚麻图案 1 线条 1 线条 2 .. 亚麻图案 2

所以这里Patern1在Patern2出现之前出现了多次。我想得到Patern1和Patern2之间的线。不是Patern1 和Patern1 之间的线。

就像:Patern1 line1 line2 .. linen Patern2 Patern1 line1 line2 .. linen Patern2 Patern1 line1 line2 .. linen Patern2

谢谢乌特帕尔

相关内容