这是输入文件:
#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 中的每一行创建一个文件
您能帮我弄清楚如何修复此代码吗?谢谢。
最佳答案
不应为每一行打开新文件,而应在每个范围的开头打开它。
使用范围的返回值来确定何时打开文件并仅打印边界条件之间的那些行。
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 $_;
}
}
}
关于perl - 通过将 2 个模式之间的行写入新文件,将文件拆分为多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25783922/