如何在匹配条件之间从文件中提取部分文本

Adr*_*ana 5 sed awk text-processing

我有一个文件如下。

~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished

~PAR2~
This is Par2 line 1
This is Par2 line 2

Par Finished
Run Code Online (Sandbox Code Playgroud)

如果我通过PAR1,我应该得到PAR1Par Finished线之间的所有线。我怎么才能得到它?我正在调查awk并且sed找不到任何选项。

Ste*_*ris 9

如果你想要页眉和页脚行,那么它很简单,sed 例如

sed -n "/^~PAR1~$/,/Par Finished/p"
Run Code Online (Sandbox Code Playgroud)

这很容易与变量一起使用

START=PAR1
sed -n "/^~$START~$/,/Par Finished/p"
Run Code Online (Sandbox Code Playgroud)

我们也可以让最后一行成为一个变量

START=PAR1
END="Par Finished"
sed -n "/^~$START~$/,/$END/p"
Run Code Online (Sandbox Code Playgroud)

结果如下:

~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished
Run Code Online (Sandbox Code Playgroud)

现在,如果您不想要开始/结束行并且您不想要空行,那么它会稍微复杂一些。

可能有更好的方法,但这对我有用:

sed -n "/^~$START~$/,/$END/ { /^~$START~$/d ; /$END/d ; /^$/d ; p }"
Run Code Online (Sandbox Code Playgroud)

这样做的结果是

This is Par1 line 1
This is Par1 line 2
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 2

您可以使用该Par Finished行(带有可选的尾随空白行)作为记录分隔符(然后替换它以完成记录)

awk -vRS='\nPar Finished\n*' -vp='PAR1' '$0 ~ p {print $0,"\nPar Finished"}' parfile
~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished
Run Code Online (Sandbox Code Playgroud)

如果您有GNUawk,您可以使用特殊变量恢复记录分隔符RT(如果您愿意,可以删除额外的换行符)

gawk -vRS='\nPar Finished\n*' -vp='PAR1' '$0 ~ p {sub("\n*$", "", RT); print $0,RT}' parfile
~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished
Run Code Online (Sandbox Code Playgroud)

当然,如果您不需要传递变量 Par1,您可以使用简单的正则表达式范围

awk '/PAR1/,/Par Finished/' parfile
~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished
Run Code Online (Sandbox Code Playgroud)