我想读取一个输入文件,然后删除一行,如果它与我的正则表达式匹配。并保存没有该行的文件。
我写过
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
}
}
谢谢
答案 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/) {
$_ = '';
}
});