如何從符合條件之間的文件中提取文字的一部分

如何從符合條件之間的文件中提取文字的一部分

我有一個如下文件。

~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。我怎麼才能得到它?我正在研究awksed但找不到任何選擇。

答案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

如果您有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

當然如果你不需要通過多變的 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 行

參考: 用於多行搜尋的正規表示式 (grep)

相關內容