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