微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想通过修改删除或插入行或追加到文件的开头来更改文件内容。如何在Perl中执行此操作?

这是0700的question。我们是importing the perlfaq to Stack Overflow

解决方法

(这是 official perlfaq answer,减去任何后续编辑)

从文本文件中插入,更改或删除行的基本思想
涉及阅读和打印文件到您想要的点
更改,进行更改,然后阅读并打印文件的其余部分。
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 top\n"; # <--- 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 top\n";

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 $_;
    }

做同样的事情删除一个特定的行,使用下一个跳过
你不想在输出显示这些行。这个例子跳过每一个
第五行:

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’更改为’Barney’inFile.txt,覆盖该文件
内容。使用-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 line\n" if $. == 3' inFile.txt

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

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

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

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

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

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

… 要么 …

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

原文地址:https://www.jb51.cc/Perl/173199.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐