2014-09-11 36 views
2

这是输入文件:文件分割成多个文件写2种模式之间的线路到一个新的文件

#cat myfile 
-- START 
whatever 
whatever 
-- END 

-- START 
whatever 
whatever 
-- END 

-- START 
whatever 
whatever 
-- END 

-- START 
whatever 
whatever 
-- END 

我需要抓住-- START-- END之间行写这些行到一个单独的文件。因此,在这个用例,我应该已经创建如下4个文件:

# cat file1 
whatever 
whatever 

# cat file2 
whatever 
whatever 

# cat file3 
whatever 
whatever 

# cat file4 
whatever 
whatever 

这里是我的代码:

#!/usr/bin/perl 
use strict; 
use warnings; 

open (my $fh, "<", "/var/tmp/myfile"); 
my $counter = 0; 

while (<$fh>) 
{ 
    if (/START/../END/) 
    { 
     my $filename = "/var/tmp/file".$counter; 
     open (my $oh, ">", $filename); 
     print $oh $_; 
    } 
    $counter++; 
} 

问题:我的代码是创建一个文件每个线在-- START-- END内发现

你能帮我弄清楚如何解决这段代码。谢谢。

回答

2

而不是打开每个行的新文件,它应该打开每个范围的开始。

使用范围的返回值来确定何时打开文件并只打印边界条件之间的那些线。

my $oh; 
while (<$fh>) { 
    if (my $range = /START/ .. /END/) { 
     # Start of Range - Open the file handle 
     if ($range == 1) { 
      my $filename = "/var/tmp/file" . $counter++; 
      open($oh, ">", $filename) or die $!; 

     # Print until End of Range 
     } elsif ($range !~ /E/) { 
      print $oh $_; 
     } 
    } 
} 
+0

不工作。也认为它应该是'gt'而不是'>' – slayedbylucifer 2014-09-11 09:41:53

+0

在@ miller的编辑之后,代码正在工作。谢谢。 +1 – slayedbylucifer 2014-09-12 06:17:32

+0

@slayedbylucifer它是我的第二次编辑后,https://eval.in/192095 – 2014-09-12 06:26:33

1

您可以将输入分隔符设置为您的“ - END”标记,以便以“ - END”分隔的块读入文件。然后可以使用正则表达式来捕获所需的信息。我注释掉你我的文件/ O线和使用本地数据,因此可以运行代码,以检查它的工作原理:

#!/usr/bin/perl 
use strict; 
use warnings; 
use feature ":5.10"; 
use Data::Dumper; 

#open (my $fh, "<", "/var/tmp/myfile"); 
my $counter = 0; 

$/ = "-- END"; 
# while (<$fh>) 
while (<DATA>) 
{ if (/START\s*(\S.+?)\s*-- END/ms) 
    { 
    # my $filename = "/var/tmp/file".$counter; 
    # open (my $oh, ">", $filename); 
    # print $oh $1; 
     say "file $counter\n$1"; 
     $counter++; 
    } 
} 

__DATA__ 

-- START 
whatever1 
whatever2 
-- END 

-- START 
whatever3 
whatever4 
-- END 

-- START 
whatever5 
whatever6 
-- END 

-- START 
whatever7 
whatever8 
-- END 

输出(去STDERR,但很明显,你会取消对读取线和写入文件):

file 0 
whatever1 
whatever2 
file 1 
whatever3 
whatever4 
file 2 
whatever5 
whatever6 
file 3 
whatever7 
whatever8 
+0

你能解释这个'/START\s*(\S.+?)\s*--END/ms'正则表达式请。 – slayedbylucifer 2014-09-11 13:49:29

+0

'START' =>搜索“START”; '\ s *'=> 0或更多空格字符; '\ S' =>非空白字符; '。+?'=>将所有内容匹配到正则表达式的下一位; '\ s *'=> 0或更多空格字符; ' - END' =>文本字符串。括号捕获从“开始”之后的第一个非空白字符开始到“ - END”之前的空白为止的内容。运算符'ms'的意思是将整个事件视为一行,并允许'.'匹配换行符。参见[perlretut](http://perldoc.perl.org/perlretut.html)了解perl正则表达式的一个很好的介绍。 – 2014-09-11 14:02:06

+0

感谢您的正则表达式解释。 +1。 – slayedbylucifer 2014-09-12 06:16:49

相关问题