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,肯定必须有!
答案 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