使用perl替换第一行文件的问题

jh3*_*314 1 io perl

我有一个看起来像这样的文件:

I,like
blah...
Run Code Online (Sandbox Code Playgroud)

我想用'i,am'替换第一行来得到:

i,am
blah...
Run Code Online (Sandbox Code Playgroud)

这些是大文件,所以这就是我做的(基于此):

open(FH, "+< input.txt") or die "FAIL!";
my $header = <FH>;
chop($header);
$header =~ s/I,like/i,am/g;
seek FH, 0, 0; # go back to start of file
printf FH $header;
close FH;
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,我得到了这个:

i,amke
blah...
Run Code Online (Sandbox Code Playgroud)

我看起来像是'ke'仍然存在.我怎么摆脱它?

TLP*_*TLP 7

我会做的可能是这样的:

perl -i -pe 'if ($. == 1) { s/.*/i,am/; }' yourfile.txt
Run Code Online (Sandbox Code Playgroud)

当当前文件句柄的行计数器$.等于1 时,这只会影响第一行.正则表达式将替换除换行符之外的所有内容.如果您需要它来匹配您的特定行,您可以在if语句中包含它:

perl -i -pe 'if ($. == 1 and /^I,like$/) { s/.*/i,am/; }' yourfile.txt
Run Code Online (Sandbox Code Playgroud)

您也可以查看Tie::File,它允许您像处理数组一样处理文件,这意味着您可以这样做$line[0] = "i,am\n".但是,提到该模块可能存在性能问题.

  • 是的,不是.相当于:`{local $ ^ I =''; local @ARGV ='input.txt'; while(<>){s /// if $.== 1; 打印; } (2认同)