从文件中复制特定字符串后的文本,并附加到perl中的另一个字符串

时间:2012-10-29 18:31:33

标签: perl copy append

我想从文件中提取所需信息并将其附加到另一个文件中。第一个文件由一些行组成,没有特定模式的标题,只是以“END OF HEADER”字符串结尾。我编写了以下代码,用于查找标题末尾的匹配行:

$find = "END OF HEADER";                     
open FILEHANDLE, $filename_path;      
while (<FILEHANDLE>) {

     my $line = $_;                                                
     if ($line =~ /$find/) {

         #??? what shall I do here???                                                                                      
     }
}

,但我不知道如何获取文件的其余部分并将其附加到另一个文件。

感谢您的帮助

5 个答案:

答案 0 :(得分:2)

我猜如果文件的内容不是很大,你只需要将整个文件加载到标量中,然后用“END OF HEADER”将其拆分,然后在新版本中打印分割右侧的输出文件(追加)

open READHANDLE, 'readfile.txt' or die $!;
my $content = do { local $/; <READHANDLE> };
close READHANDLE;

my (undef,$restcontent) = split(/END OF HEADER/,$content);

open WRITEHANDLE, '>>writefile.txt' or die $!;
print WRITEHANDLE $restcontent;
close WRITEHANDLE;

答案 1 :(得分:1)

此代码将从命令行获取文件名,从第一个文件打印最多END OF HEADER的所有文件,然后从第二个文件打印所有行。请注意,输出将发送到STDOUT,因此您必须重定向输出,如下所示:

perl program.pl headfile.txt mainfile.txt > newfile.txt

更新现在已修改为在行END OF HEADER之后打印所有第一个文件,然后是所有第二个文件

use strict;
use warnings;

my ($header_file, $main_file) = @ARGV;

open my $fh, '<', $header_file or die $!;
my $print;
while (<$fh>) {
  print if $print;
  $print ||= /END OF HEADER/;
}

open $fh, '<', $main_file or die $!;
print while <$fh>;

答案 2 :(得分:1)

use strict;
use warnings;

use File::Slurp;

my @lines = read_file('readfile.txt');

while ( my $line = shift @lines) {
  next unless ($line =~ m/END OF HEADER/);
  last;
}

append_file('writefile.txt', @lines);

答案 3 :(得分:1)

我相信这会做你需要的:

use strict;
use warnings;

my $find = 'END OF HEADER';
my $fileContents;

{
    local $/;
    open my $fh_read, '<', 'theFile.txt' or die $!;
    $fileContents = <$fh_read>;
}

my ($restOfFile) = $fileContents =~ /$find(.+)/s;

open my $fh_write, '>>', 'theFileToAppend.txt' or die $!;

print $fh_write $restOfFile;

close $fh_write;

答案 4 :(得分:0)

my $status = 0;
my $find = "END OF HEADER";

open my $fh_write, '>', $file_write
    or die "Can't open file $file_write $!";

open my $fh_read, '<', $file_read
    or die "Can't open file $file_read $!";

LINE:
while (my $line = <$fh_read>) {

     if ($line =~ /$find/) {

         $status = 1;
         next LINE;
     }                       

     print $fh_write $line if $status;
}

close $fh_read;
close $fh_write;