在匹配文本之前插入新的文本行

时间:2012-11-29 18:10:13

标签: perl parsing file-io insertion

在文本文件中,我想使用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。

3 个答案:

答案 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;