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,我应该得到PAR1和Par Finished线之间的所有线。我怎么才能得到它?我正在调查awk并且sed找不到任何选项。
如果你想要页眉和页脚行,那么它很简单,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)
您可以使用该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)