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

在Perl中,如何更改、删除或插入文件中的一行,或追加到文件的开头?,perl,file,Perl,File,人们一直在问这个问题,我也一直在用同样的答案回答。现在我们可以在Stackoverflow上指出这一点。来自: 插入、更改或删除文本文件中的行的基本思想包括读取并打印文件到要进行更改的位置,进行更改,然后读取并打印文件的其余部分。Perl不提供对行的随机访问(特别是因为记录输入分隔符$/是可变的),尽管诸如之类的模块可以伪造它 执行这些任务的Perl程序的基本形式是打开文件,打印其行,然后关闭文件: open my $in, '<', $file or die "C

人们一直在问这个问题,我也一直在用同样的答案回答。现在我们可以在Stackoverflow上指出这一点。

来自:

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

执行这些任务的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;
要仅更改特定行,输入行号“
$。
”非常有用。首先阅读并打印出你想要更改的行。接下来,读一行你想改变的内容,改变它,然后打印出来。然后,阅读其余行并打印以下内容:

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 $_;
    }
通过使用
next
跳过您不想在输出中显示的行,执行相同的操作来删除特定行。此示例每五行跳过一次:

while( <$in> )
    {
    next unless $. % 5;
    print $out $_;
    }
要备份
infle.txt
,请为
-i
提供要添加的文件扩展名:

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
类似,只是它不会在循环结束时打印
$\uu
,所以您必须自己打印。在这种情况下,请先打印
$\uu
,然后打印要添加的行

perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt
要删除行,请仅打印所需的行

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

    ... or ...

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

只是想知道,为什么在我们编写
perl-pie…
?-pie不起作用,因为-i需要一个参数,它认为“e”属于它。最后一个变体:
perl-pi-e'next,除非/d/'infle.txt
不起作用,并且不再显示在中。评论中的一些讨论在这里重新发布
perlfaqN
有什么意义?你就不能给提问者一个
perfaq5
的链接吗?我总是讨厌链接。网站过时,URL更改,等等。我认为Stackoverflow应该捕获信息,这样它就可以一直保存信息。记住,这是一个长期项目,三年后的答案应该和现在一样好。链接并不能保证这一点。请记住,www.perldoc.com曾经是文档的首选站点,直到它消失。这可能发生在任何网站上。另外,请看我询问导入所有perlfaq的元线程:@brian您收到StackOverflow团队关于导入perlfaq的正式回复了吗?我想Jeff会听从人们的决定。我只是还没来得及做。
perl -pi -e 's/Fred/Barney/ if $. == 5' inFile.txt
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
perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt
perl -ni -e 'print unless /d/' inFile.txt

    ... or ...

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