我正在执行以下操作来编辑文件中的特定行,并在编辑后将所有内容发送到另一个文件。
我输入文件的内容是: -
;first set
00 01 05 10 10 11 22 55 66
;second set
00 00 00 01 10 11 11 11 11
;third set
00 01 05 10 ff 11 22 55 66
;fourth set
00 00 00 01 10 11 11 11 11
在第三个集合之后的行中,第五个元素ff
我想用5f
替换,并将该文件的全部内容传递给另一个文件。
我编写了用5f
替换第五个元素的代码,但下一行也与输出文件中编辑的行连接。
输出文件如下
;first set
00 01 05 10 10 11 22 55 66
;second set
00 00 00 01 10 11 11 11 11
;third set
00 01 05 10 5f 11 22 55 66;fourth set
00 00 00 01 10 11 11 11 11
my $parameter = "third";
my $inputfile = $ARGV[0];
my $outputfile = "Extract"."_".$inputfile;
my $check = 0;
open(INPUT, "<$inputfile") or die $!;
open(OUT, ">$outputfile") or die $!;
while (<INPUT>)
{
if($check == 1)
{
my $line = $_;
my @chunks = split ' ', $line;
$chunks[4] = "5f";
$check = 0;
print OUT join (" ", @chunks);
}
else
{
print OUT $_;
}
if($_ =~ m/$parameter/gi)
{
$check = 1;
}
}
close(OUT);
close(INPUT);
答案 0 :(得分:1)
您的split ' ', $line
命令会从字符串中删除所有空白(包括换行符),只留下数据。它与my @chunks = $line =~ /\S+/g
相同。因此,您必须在打印后添加换行符。
这就是我编写解决方案的方法
use strict;
use warnings;
my $parameter = 'third';
my ($inputfile) = @ARGV;
my $outputfile = "Extract_$inputfile";
open my $in_fh, '<', $inputfile or die $!;
open my $out_fh, '>', $outputfile or die $!;
select $out_fh;
while ( <$in_fh> ) {
print;
if ( /$parameter/ ) {
my @chunks = split ' ', <$in_fh>;
$chunks[4] = '5f';
print "@chunks\n";
}
}
<强>输出强>
;first set
00 01 05 10 10 11 22 55 66
;second set
00 00 00 01 10 11 11 11 11
;third set
00 01 05 10 5f 11 22 55 66
;fourth set
00 00 00 01 10 11 11 11 11