删除与正则表达式匹配的行以及前两行

时间:2014-04-28 08:28:33

标签: perl sed lines

我有一个文件,我需要在正则表达式foo之前删除2行。

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轻松完成:

casper_mint@casper-mint-dell /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 个答案:

答案 0 :(得分:6)

perl中,您可以使用范围运算符:

perl -ne 'print unless /bad/ .. /foo/' filename

会提供与sed相同的输出。


您可能还想查看s2p

相关:How can I pull out lines between two patterns that are themselves on different lines?

答案 1 :(得分: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