2014-05-11 41 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

相關問題