2013-01-15 30 views
7

我在的text.txt如下行:之前「ABC」的每一個最後一次出現之間的界限「EFG」和「EFG」發現線路

blah blah.. 
blah abc blah.. 
blah abc blah 
blah blah.. 
blah blah.. 
blah blah.. 
blah efg blah blah 
blah blah.. 
blah abc blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah blah.. 
blah efg blah blah 
blah blah.. 
blah blah.. 

我要輸出,對於上面的例子,我要輸出:

blah abc blah 
blah blah.. 
blah blah.. 
blah blah.. 
blah efg blah blah 
blah abc blah 
blah blah.. 
blah efg blah blah 

我知道SED可以使用兩個模式,如選擇範圍:

sed -n '/abc/,/efg/p' test.txt 

Howeve R上的輸出會從「ABC」中第一次出現開始,而不是最後一個,輸出如下:

blah abc blah.. 
blah abc blah 
blah blah.. 
blah blah.. 
blah blah.. 
blah efg blah blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah blah.. 
blah efg blah blah 

任何增強我可以做在命令行上使輸出將從最後一次出現開始「abc」?

回答

6

這可能會爲你工作(GNU SED):

sed -n '/\<abc\>/,/\<efg\>/{/\<abc\>/{h;d};H;/\<efg\>/{x;p}}' file 
+3

我做了一些搜索瞭解這一點,糾正我,如果我錯了:1,躲過尖括號是可選的,這表明我們正在尋找因爲是話。 2,「h」的命令裝置節省模式空間到保持緩衝器,「H」手段附加圖案空間分成保持緩衝器,「x」表示交換模式空間和保持緩衝。 3,整個命令將首先選擇的第一行開頭的範圍包含「ABC」,並與下面第一行結束含有「EFG」,然後在每個範圍找到的最後一行包含「ABC」,並保存線以下直到行包含「EFG」,並將其打印 – poiu2000

+0

謝謝@potong用於提供這樣一個很好的解決方案 – poiu2000