加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在文件中更改,删除或插入一行,或者追加到Perl中文件的开头?

发布时间:2020-12-15 22:01:54 所属栏目:大数据 来源:网络整理
导读:人们一直在问这个问题,我从 perlfaq5提供同样的答案,我一直在回答.现在我们可以指向Stackoverflow. 解决方法 从 perlfaq5: 从文本文件中插入,更改或删除行的基本思想包括将文件读取和打印到要进行更改的位置,进行更改,然后读取和打印文件的其余部分. Perl不
人们一直在问这个问题,我从 perlfaq5提供同样的答案,我一直在回答.现在我们可以指向Stackoverflow.

解决方法

从 perlfaq5:

从文本文件中插入,更改或删除行的基本思想包括将文件读取和打印到要进行更改的位置,进行更改,然后读取和打印文件的其余部分. Perl不提供对行的随机访问(特别是因为记录输入分隔符$/,是可变的),尽管诸如Tie::File的模块可以伪造它.

执行这些任务的Perl程序是打开文件,打印其行,然后关闭文件的基本形式:

open my $in,'<',$file      or die "Can't read old file: $!";
open my $out,'>',"$file.new" or die "Can't write new file: $!";

while( <$in> )
    {
    print $out $_;
    }

close $out;

在该基本形式中,添加插入,更改或删除行所需的部分.

要在开始之前添加行,请在输入打印现有行的循环之前打印这些行.

open my $in,"$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the topn"; # <--- HERE'S THE MAGIC

while( <$in> )
    {
    print $out $_;
    }

close $out;

要更改现有行,请插入代码以修改while循环中的行.在这种情况下,代码会找到所有较低版本的“perl”,并将它们加载到其中.它发生在每一行,所以要确保你应该这样做在每一行!

open my $in,"$file.new" or die "Can't write new file: $!";

print $out "# Add this line to the topn";

while( <$in> )
    {
    s/b(perl)b/Perl/g;
    print $out $_;
    }

close $out;

要更改特定行,输入行号$.是有用的.首先阅读并打印要更改的行.接下来,阅读要更改的单行,更改它并打印.之后,阅读其余的行并打印:

while( <$in> )   # print the lines before the change
    {
    print $out $_;
    last if $. == 4; # line number before change
    }

my $line = <$in>;
$line =~ s/b(perl)b/Perl/g;
print $out $line;

while( <$in> )   # print the rest of the lines
    {
    print $out $_;
    }

要跳过线,请使用循环控件.此示例中的下一个将跳过注释行,最后一次遇到__END__或__DATA__时停止所有处理.

while( <$in> )
    {
    next if /^s+#/;             # skip comment lines
    last if /^__(END|DATA)__$/;  # stop at end of code marker
    print $out $_;
    }

做同样的事情删除一个特定的行通过使用next跳过你不想显示在输出的行.这个例子跳过第五行:

while( <$in> )
    {
    next unless $. % 5;
    print $out $_;
    }

如果由于某种奇怪的原因,您真的想要一次看到整个文件,而不是逐行处理,您可以将其剔除(只要您可以将内存中的所有内容都适应):

open my $in,$file      or die "Can't read old file: $!"
open my $out,"$file.new" or die "Can't write new file: $!";

my @lines = do { local $/; <$in> }; # slurp!

    # do your magic here

print $out @lines;

诸如File::Slurp和Tie::File之类的模块也可以帮助.但是,如果可以,请避免立即读取整个文件. Perl将不会将该内存恢复到操作系统,直到进程完成.

您也可以使用Perl one-liners来就地修改文件.以下将所有“Fred”更改为inFile.txt中的“Barney”,用新内容覆盖文件.使用-p开关,Perl围绕您用-e指定的代码围绕一段时间循环,而-i打开就地编辑.当前行是$_.使用-p,Perl将在循环结束时自动打印$_的值.详见perlrun.

perl -pi -e 's/Fred/Barney/' inFile.txt

要备份inFile.txt,请输入文件扩展名来添加:

perl -pi.bak -e 's/Fred/Barney/' inFile.txt

要更改第五行,您可以添加一个测试检查$.,输入行号,然后只在测试通过时执行操作:

perl -pi -e 's/Fred/Barney/ if $. == 5' inFile.txt

要在某行之前添加行,您可以在Perl打印$_之前添加一行(或多行!):

perl -pi -e 'print "Put before third linen" if $. == 3' inFile.txt

您甚至可以将一行添加到文件的开头,因为当前行在循环结束时打印:

perl -pi -e 'print "Put before first linen" if $. == 1' inFile.txt

要在文件中已经有一行之后插入一行,请使用-n开关.它就像-p一样,除了在循环结束时不打印$_,所以你必须自己去做.在这种情况下,首先打印$_,然后打印要添加的行.

perl -ni -e 'print; print "Put after fifth linen" if $. == 5' inFile.txt

要删除行,只打印您想要的行.

perl -ni -e 'print unless /d/' inFile.txt

    ... or ...

perl -pi -e 'next unless /d/' inFile.txt

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读