簡體   English   中英

選擇兩個模式之間的第一個匹配。如果使用sed / awk / grep找到第三個模式,則重新開始搜索

[英]Select first match between two patterns.Restart search if a 3rd pattern is found using sed/awk/grep

我正在努力完成以下任務(我一直在尋找答案)。

搜索是在START_PATTERN和END_PATTERN1之間的文本

文件結構如下:

text
text
...
START_PATTERN
line1
line2
END_PATTERN2
text
text
...
START_PATTERN
line1
line2
END_PATTERN1
text
text
...

如果找到END_PATTERN2,任務將是重新開始搜索。 因此,命令輸出應為:

START_PATTERN
line1
line2
END_PATTERN1

感謝您的時間!

該行應適用於您的示例:

 tac file|sed '/END_PATTERN1/,/START_PAT/!d'|tac

測試:(我在預期的代碼行中添加了xx ):

kent$  cat f
text
text
...
START_PATTERN
line1
line2
END_PATTERN2
text
text
...
START_PATTERN
xxline1
xxline2
END_PATTERN1
text


kent$  tac f|sed '/END_PATTERN1/,/START_PAT/!d'|tac
START_PATTERN
xxline1
xxline2
END_PATTERN1

編輯

只參加第一個比賽,只有awk:

awk '{a[NR]=$0}
     /START_PAT/{s=NR}
     /END_PATTERN2/{s=0}
     /END_PATTERN1/{exit}
     END{for(i=s;i<=NR;i++)print a[i]}' file

為此,我將在找到第一個模式后保留行緩沖,如果找到END_PATTERN2其重置:

awk 'x { next }
/START_PATTERN/ { n = 1; f = 1 } 
f { lines[n++] = $0 } 
/END_PATTERN1/ { f = 0; x = 1 } 
/END_PATTERN2/ { n = 1; f = 0 } 
END { for (i = 1; i < n; ++i) print lines[i] }' file

f是確定是否將當前行保存到緩沖區lines的標志。 n是用於索引緩沖區的計數器。 處理完文件后,將打印緩沖區中的前n行。

我還添加了一個變量x ,該變量一旦設置,將導致所有行都被跳過。 這意味着將僅保存第一個匹配塊。

這可能對您有用(GNU sed):

sed -n '/START_PATTERN/!d;:a;N;/END_PATTERN2/d;/END_PATTERN1/!ba;p;d' file

使用-n grep-like開關。 在查找START_PATTERN開始收集行。 如果找到END_PATTERN2刪除該集合。 找到END_PATTERN1打印線條。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM