更改perl中的文件内容 - 正则表达式

时间:2014-04-14 17:02:54

标签: perl

我有一个文件(prac.txt),其中包含以下内容:

"line1"
"line2"
"Hello World"
"line3"

我想阅读整个文件并将“hello world”替换为“第3行”。我写了代码但它只是在执行时挂起。任何人都可以指导我..?看起来我的正则表达式需要一些改变。

这是我的代码:

my @tmp = ();

my $FILE;

open ( $FILE, '<', 'prac.txt') or die "Can't open prac.txt\n";

while($FILE) {


    my $cur_line = $_;

    if($cur_line =~ /\"Hello\"/){

        push(@tmp, " \" line 3\"; \n");

    }

    else {

        push(@tmp, $cur_line);

    }

}

close($FILE);

open ($FILE, '>', 'prac.txt') or die "Can't open file\n";

print FILE @tmp;

close($FILE);

任何帮助将不胜感激。感谢

4 个答案:

答案 0 :(得分:1)

代码存在一些问题。这是一个工作版本,我在需要进行更改的地方发表评论。

#!/usr/bin/perl
use strict;
use warnings;

my @tmp = ();

my $FILE;

open ( $FILE, '<', 'prac.txt') or die "Can't open prac.txt\n";

# You need to use the diamond operator `<>` around `$FILE` to read in the file.
while(<$FILE>) {


    my $cur_line = $_;

    # Make sure this regex matches your input file
    if($cur_line =~ /"Hello World"/){

        push(@tmp, " \" line 3\"; \n");

    }

    else {

        push(@tmp, $cur_line);

    }

}

close($FILE);

open ($FILE, '>', 'prac.txt') or die "Can't open file\n";

# You need a `$` in front of `FILE`
print $FILE @tmp;

close($FILE);

另外,我想用open的正确3参数形式和词法文件句柄说好。

答案 1 :(得分:0)

in perl one-liner

perl -i -lpe '$_ = q{"Line 3"} if /"Hello World"/' prac.txt

或者扩展为完整的脚本:

use strict;
use warnings;

local @ARGV = 'prac.txt';
local $^I = '.bak';

while (<>) {
    $_ = qq{"Line 3"\n} if /"Hello World"/;
    print;
}

# unlink "prac.txt$^I"; # Uncomment to delete backup.

答案 2 :(得分:0)

您错过了$FILEwhile周围的尖括号。它应该是

while (<$FILE>)

或者

for my $cur_line (<$FILE>)

您应该在脚本的顶部包含此内容,以便更好地报告错误:

use strict;
use warnings;

答案 3 :(得分:0)

但这可以更轻松地完成:

perl -i -p -e 's/Hello World/line3/' prac.txt