簡體   English   中英

如何使用sed命令或awk命令在文件中多次打印兩個模式之間匹配但第二個模式同時存在的行?

[英]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/收集Haveday之間最短的行數,您所需的時間最長嗎? 如果是這樣,這里就是一個解決方案。

將行中的行存儲在第一行中包含Have的行中,然后在出現單詞Have每次出現時,刪除上一個集合的最后day之后的行並進行打印。 在文件結束時,再重復一次。

注意:如果沒有遇到包含day行,則命令/Have/,/day/將收集從包含第一個Have到文件末尾的所有行。 僅當同時滿足兩個條件時,上述解決方案才打印。

這應該在awk工作。 基本上,它會進行2次傳遞-這就是為什么F1作為要處理的文件在命令末尾出現兩次的原因。

在第一次通過(FNR == NR)時,它將行號保存在“ Have”的第一次出現的s (開始)中,將最后一次出現的行號保存在“ day”這個單詞的e (結束)中”。

在第二遍,(FNR!= NR),它在se之間(開始和結束)打印行。

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.

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