[英]how to print lines matching between two patterns but second pattern existing multiple times in a file using sed command or awk command?
我有這個輸入文件F1:
Good morning!
Have a nice day;
see you again the next day;
Bye;
我想打印“有”和“天”之間的線。 我嘗試使用以下命令: *sed -n '/Have/,/day/ p*' F1
輸出為:祝你有美好的一天,但我也希望打印第二行,因為它也具有相同的“ day”模式。 期望的輸出: 祝你有美好的一天; 第二天再見;
誰能幫我這個? 提前致謝。
這可能對您有用(GNU sed):
sed '/Have/{:a;x;s/^\(.*\n.*day[^\n]*\).*/\1/p;x;h;d};H;$!d;ba' file
命令/Have/,/day/
收集Have
和day
之間最短的行數,您所需的時間最長嗎? 如果是這樣,這里就是一個解決方案。
將行中的行存儲在第一行中包含Have
的行中,然后在出現單詞Have
每次出現時,刪除上一個集合的最后day
之后的行並進行打印。 在文件結束時,再重復一次。
注意:如果沒有遇到包含day
行,則命令/Have/,/day/
將收集從包含第一個Have
到文件末尾的所有行。 僅當同時滿足兩個條件時,上述解決方案才打印。
這應該在awk
工作。 基本上,它會進行2次傳遞-這就是為什么F1
作為要處理的文件在命令末尾出現兩次的原因。
在第一次通過(FNR == NR)時,它將行號保存在“ Have”的第一次出現的s
(開始)中,將最后一次出現的行號保存在“ day”這個單詞的e
(結束)中”。
在第二遍,(FNR!= NR),它在s
和e
之間(開始和結束)打印行。
awk '/Have/&&s==0{s=FNR} /day/&&FNR==NR{e=NR} (FNR!=NR)&&(FNR>=s)&&(FNR<=e)' F1 F1
以下將單向執行
awk '/Have/ { p=1 }
/day/ && (p==1) { p=2; print; next }
!/day/ && (p==2) { p = 0 }
p' <file>
我們在這里要做的是跟蹤標簽p
。 如果找到Have
,則設置p=1
;如果找到day
,則設置p=2
,也打印並移至下一行。 如果p>1
則表示我們找到了day
,如果該行不包含day
則將print-label設置回零,否則打印。
輸出是
Have a nice day;
see you again the next day;
這將打印塊,直到最后day
。
表格的輸入
Good morning!
Have a nice day;
see you again the next day;
Bye;
Good morning!
Have a nice day;
see you again the next day;
Bye;
將輸出:
Have a nice day;
see you again the next day;
Have a nice day;
see you again the next day;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.