编辑perl中的文件内容

时间:2017-03-19 15:05:44

标签: perl file-handling

我想读取一个输入文件,然后删除一行,如果它与我的正则表达式匹配。并保存没有该行的文件。

我写过

open(my $fh, '<:encoding(UTF-8)', $original_file_path or die "Could not open file $original_file_path $!";

while (my $line = <$fh> ) {
    chomp $line;
    if ($line ~=/myregex/){
        delete line from file
    }
}

谢谢

2 个答案:

答案 0 :(得分:6)

您可以使用-i标志修改文件到位

在你的情况下,一个简单的一个班轮就可以了:

perl -i -ne 'print unless /myregex/' the_name_of_your_file

如PerlDuck所述,如果您希望保留原始文件的副本,则可以:在-i标记后添加扩展名,例如-i.bak-i~ ,然后原始文件将在其名称后保留此扩展名。

您可以在perlrun上找到有关就地文件修改的更多信息。

请注意,如果您使用的是Windows (MS-DOS),则需要为备份文件指定一个扩展名,以后可以自由删除。请参阅此link

通过将$^I设置为不同于undef的值,您可以在脚本中获得相同的行为。例如:

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

{
    local @ARGV = ( $original_file_path );
    local $^I = ''; # or set it to something else if you want to keep a backup
    while (<>) {
        print unless /myregex/
    }
}

我已经使用过local @ARGV所以如果你已经在@ARGV中找到了某些内容,那么它就不会造成任何麻烦。如果@ARGV为空,那么push @ARGV, $original_file_path也可以。

但是,如果你的脚本中有更多的东西要做,你可能更喜欢完整的脚本而不是单行。在这种情况下,您应该阅读输入文件,并将要保留的行打印到另一个文件,然后将move第二个文件打印到第一个文件。

答案 1 :(得分:4)

有些模块可以让您的生活更轻松。例如。这是使用Path::Tiny的解决方案:

use Path::Tiny;

path($original_file_path)->edit_lines_utf8(sub {
    if (/myregex/) {
        $_ = '';
    }
});