用perl替换指定行号上的模式

用perl替换指定行号上的模式,perl,sed,Perl,Sed,我正在尝试使用perl的便捷的非贪婪搜索模式,但要让perl在指定的行上搜索和替换,我运气不佳,例如: perl -pi -e '10,19s/pat1/pat2/g' file 我经常使用sed。有没有一种方法可以使用perl实现这一点?我陷入了困境,sed的非贪心函数不能满足我的需要,但是perl会满足我的需要。使用变量匹配行号 如果要在这两个行号(包括行号)之间替换该图案,可以使用,如下所示: perl -i -pe 's/pat1/pat2/g if 10 .. 19' file 1

我正在尝试使用perl的便捷的非贪婪搜索模式,但要让perl在指定的行上搜索和替换,我运气不佳,例如:

perl -pi -e '10,19s/pat1/pat2/g' file
我经常使用sed。有没有一种方法可以使用perl实现这一点?我陷入了困境,sed的非贪心函数不能满足我的需要,但是perl会满足我的需要。

使用变量匹配行号

如果要在这两个行号(包括行号)之间替换该图案,可以使用,如下所示:

perl -i -pe 's/pat1/pat2/g if 10 .. 19' file

10,19
应该在做什么?@Miller这是从
sed
翻译过来的尝试
sed'10,19s/foo/bar/g'
只对第10行到第19行(包括第10行和第19行)进行替换。@Miller 10,19是指定的行范围,第10-19行,在该行上,我想用pat2I替换所有出现的pat1。我想知道当文件很大时,是否有办法在第19行之后退出,而不重击原始文件。@jaypal请参阅(无需担心,这不适用于就地编辑)@jaypal不会不截断文件。Miller,谢谢,是的,我就是这么想的。@ThisSuitesBlack不谢谢你的参考,我考虑的更多是更新现有文件,然后在编辑所需的行后退出,而不是遍历整个文件,跳过其余的行,因为它们超出了范围。@jaypal,当然不是;您仍然需要编写输出文件的其余部分,这需要读取输入文件的其余部分。最多,您可以停止检查正则表达式。
perl-i-e'while(1){退出,除非$\s/pat1/pat2/g;print;last if$。==19;}打印while;'file