用于替换行范围的perl习语(类似sed)

时间:2015-04-15 16:31:21

标签: perl sed

sed的一个很好的特性是命令(其中包括替换)可以限制为由regexp表达式定义的一系列行(或者通过行号,但不要小心)。这是一个简单的例子:

sed '/^Page 5:/,/^Page 6:/s/this/that/g'  

我只是想将一个更复杂的sed脚本转换为perl,虽然regexp替换没有问题,但我意识到我不知道一种直接的方法来限制替换到一系列行。我可以写

perl -p -e 's/^(Page 5:.*)this/$1that/g'

this开头的行上将that更改为Page 5:,但不会在后面的行中更改{甚至在此行上,尽管g它&#39 ;由于比赛不重叠,因此只能替换一次)。如果没有编写明确的输入循环并跟踪$inrange这样的状态变量,那么有没有一个很好的快捷方式可以做到这一点?这是perl,肯定必须有!

1 个答案:

答案 0 :(得分:4)

有。你在perl中拥有的是'range operator'

有点像这样:

if ( m/Page 5:/ .. m/Page 6:/ ) { 
     s/this/that/g;
}

如果您处于两种模式之间,则评估为“true”,否则为false。

E.g:

use strict;
use warnings;


while (<DATA>) {
    if ( m/Page 5:/ .. m/Page 6:/ ) {
        s/this/that/g;
    }
    print;
}

__DATA__

Page 1:
this
this
more this
Page 5:
this 
this this
this
Page 6:
this 
more this
and some more this