我有一個如下文件。
~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
如果我通過了PAR1
,我應該得到PAR1
和之間的所有線Par Finished
。我怎麼才能得到它?我正在研究awk
,sed
但找不到任何選擇。
答案1
如果你想要頁首和頁尾行那麼這很簡單,sed
例如
sed -n "/^~PAR1~$/,/Par Finished/p"
這與變數一起使用很簡單
START=PAR1
sed -n "/^~$START~$/,/Par Finished/p"
我們也可以將最後一行設為變數
START=PAR1
END="Par Finished"
sed -n "/^~$START~$/,/$END/p"
結果如下:
~PAR1~
This is Par1 line 1
This is Par1 line 2
Par Finished
現在,如果您不需要開始/結束行並且不需要空白行,那麼情況會稍微複雜一些。
可能有更好的方法,但這對我有用:
sed -n "/^~$START~$/,/$END/ { /^~$START~$/d ; /$END/d ; /^$/d ; p }"
這樣做的結果是
This is Par1 line 1
This is Par1 line 2
答案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
如果您有GNU
awk,您可以使用特殊變數來恢復記錄分隔符號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
當然如果你不需要通過多變的 Par1
你使用一個簡單的正規表示式範圍
awk '/PAR1/,/Par Finished/' parfile
~PAR1~
This is Par1 line 1
This is Par1 line 2
Par Finished
答案3
對於足夠小的文件grep
輸入pcre
$ s="PAR1"
$ grep -oPz "(?s)[^\n]*${s}.*?\n.*?Par Finished.*?\n" ip.txt
~PAR1~
This is Par1 line 1
This is Par1 line 2
Par Finished
若要取得圖案之間的線條:
$ grep -oPz "(?s)${s}.*?\n\K.*?(?=Par 完成)" ip.txt 這是 Par1 第 1 行 這是 Par1 第 2 行
將變數更改為PAR2
$s=“PAR2” $ grep -oPz "(?s)${s}.*?\n\K.*?(?=Par 完成)" ip.txt 這是 Par2 第 1 行 這是 Par2 第 2 行