2014-05-11 107 views
1

我需要从两个标记点之间的文件中剪切一组行。例如,文件是使用Perl从两个标记点之间的文件中删除文本块

file.txt的

END 
line 1 not removed 
END 
line 2 not removed 
line 3 not removed 
BEGIN 
line 1 is to be removed 
line 2 is to be removed 
line 3 is to be removed 
END 
line two last not removed 
END 
line three last not removed 
line four last not removed 

我想删除BEGINEND之间的界线。新的文件将成为

FILE2.TXT

END 
line 1 not removed 
END 
line 2 not removed 
line 3 not removed 
line two last not removed 
END 
line three last not removed 
line four last not removed 

这意味着BEGINBEGIN后的第一END和它们之间的连线应该被删除。

我能写这个程序,它完美的作品。但是有没有更好的方法来做到这一点?

use File::Copy; 

$j = $i = 0; 

open(DATA, "<file1.txt"); 
open(DATA1, ">file2.txt"); 

while (<DATA>) { 
    if ($_ =~ /^BEGIN/) { $i = 1; } 
    if ($_ =~ /^END/ && $i == 1) { $i = 0; next if $_ } 
    if ($i == 1) { next if $_; } 
    print DATA1 $_; 
} 

close(DATA); 
close(DATA1); 

copy "file2.txt", "file1.txt"; 

回答

11
while(<DATA>) { 

    print DATA1 $_ unless /^BEGIN/ .. /^END/; 
} 

关于从perldoc范围..操作者,

在标量上下文中, “..” 返回一个布尔值。运算符像双稳态触发器一样是双稳态的,并模拟sed,awk和各种编辑器的行范围(逗号)运算符。每个“..”运算符都维护自己的布尔状态,即使在调用包含它的子例程时也是如此。只要其左操作数是假的,它就是错误的。一旦左操作数为真,范围运算符保持为真,直到右操作数为真,在此之后范围运算符再次变为假。

+0

哇!这很好。我不知道范围操作员。 – Nijin

+0

除了它提供了所需的结果之外,推荐一个Perl咒语是无可非议的。我认为从文档摘录中可以清楚地看出,范围运算符'''和'...'的确切功能有点神秘。如果任何人能够简洁直观地解释是否打印出'BEGIN'行或'END'行,以及'..'和'...'之间的区别是什么,那么请添加这个智慧。 – Borodin

+0

@mpapec:您的修订没有任何可见的变化,因此我已经将其回滚 – Borodin

相关问题