2014-04-28 31 views
1

我有一個文件,我需要刪除正則表達式foo之前的兩行。刪除與之前的兩行匹配的正則表達式行

bad 1 
foo 
good 1 
good 2 
good 3 
bad 2 
bad 3 
foo 
good 4 
good 5 
good 6 
bad 4 
bad 5 
foo 
good 7 
bad 6 
bad 7 
foo 
good 8 
good 9 
good 10 
bad 8 
bad 9 
foo 
good11 

我可以用SED容易做到這一點:

[email protected] /tmp $ cat dddd | sed '/bad/ , /foo/d' 
good 1 
good 2 
good 3 
good 4 
good 5 
good 6 
good 7 
good 8 
good 9 
good 10 
good11 

我如何能做到這一點在Perl?

+2

請問您的數據有這個空行? – Jotne

+0

@Jotne這似乎是如此。假定當兩個圖案之間的線被刪除時,輸出包含一對連續的空行。 – devnull

回答

1

在一個班輪:

print -ne 'push @b, $_; @b =() if /^foo$/; print shift @b if @b > 2; END {print @b};' file 

或者在一個完整的腳本證明:

use strict; 
use warnings; 

my @b; 

while (<DATA>) { 
    push @b, $_; 
    @b =() if /^foo/; 
    print shift @b if @b > 2; 
} 

END {print @b}; 

__DATA__ 
bad 1 
foo 
good 1 
good 2 
good 3 
bad 2 
bad 3 
foo 
good 4 
good 5 
good 6 
bad 4 
bad 5 
foo 
good 7 
bad 6 
bad 7 
foo 
good 8 
good 9 
good 10 
bad 8 
bad 9 
foo 
good11 

兩個輸出:

good 1 
good 2 
good 3 
good 4 
good 5 
good 6 
good 7 
good 8 
good 9 
good 10 
good11 
相關問題