在文本文件中,我想使用perl在另一行文本的每个匹配项之前插入一行新文本。
示例 - 我的文件是:
holiday
april
icecream: sunday
jujubee
carefree
icecream: sunday
Christmas
icecream: sunday
towel
...
我想在''icecream: saturday'
行之前插入一行文字icecream: sunday'
。所以之后,文本文件看起来像。是的,我在搜索和替换模式中都需要冒号:
。
holiday
april
icecream: saturday
icecream: sunday
jujubee
carefree
icecream: saturday
icecream: sunday
Christmas
icecream: saturday
icecream: sunday
towel
...
我想在Windows PC上使用perl 5.14这样做。我已经安装了Perl。我在这个网站上搜索并尝试了很多其他的例子,但它们并不适合我,不幸的是我不是Perl的完整专家。
如果有一个例子也使用sed,我也有Cygwin sed。
答案 0 :(得分:6)
这是一个命令行版本。
perl -i.bak -pe '$_ = qq[icecream: saturday\n$_] if $_ eq qq[icecream: sunday\n]' yourfile.txt
命令行选项说明:
-i.bak :对输入文件执行操作,创建扩展名为.bak的备份版本
-p :遍历输入文件的每一行,将行放入$ _并在每次迭代后打印$ _
-e :为输入文件
中的每一行执行此代码Perl的命令行选项记录在perlrun。
中代码说明:
如果数据行($ _)是“icecream:sunday \ n”,那么在该行前面加上“icecream:saturday \ n”。
然后只打印$ _(使用-p标志隐式完成)。
答案 1 :(得分:2)
open FILE, "<icecream.txt" or die $!;
my @lines = <FILE>;
close FILE or die $!;
my $idx = 0;
do {
if($lines[$idx] =~ /icecream: sunday/) {
splice @lines, $idx, 0, "icecream: saturday\n";
$idx++;
}
$idx++;
} until($idx >= @lines);
open FILE, ">icecream.txt" or die $!;
print FILE join("",@lines);
close FILE;
答案 2 :(得分:2)
以下是使用File::Slurp模块的选项:
use strict;
use warnings;
use File::Slurp qw/:edit/;
edit_file sub { s/(icecream: sunday)/icecream: saturday\n$1/g }, 'data.txt';
并且没有使用该模块的选项:
use strict;
use warnings;
open my $fhIn, '<', 'data.txt' or die $!;
open my $fhOut, '>', 'data_modified.txt' or die $!;
while (<$fhIn>) {
print $fhOut "icecream: saturday\n" if /icecream: sunday/;
print $fhOut $_;
}
close $fhOut;
close $fhIn;