perl编辑文件内容

edit file contents in perl

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

我写了

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
    }
}

谢谢

您可以使用 -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 第二个文件到第一个文件。

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

的解决方案
use Path::Tiny;

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