Perl 如何在Unix上的多个文件中的特定行插入一行?

Perl 如何在Unix上的多个文件中的特定行插入一行?,perl,unix,sed,Perl,Unix,Sed,我需要在目录中数百个文件的第二行插入一行特定文本(从而将文件中的其他行向下移动)。有关于如何实现这一点的快速Unix提示吗 sed -i -e '2iYour line here' /dir/* 请注意,sed-i语义因Unix风格而异,因此请检查您的mansed。这是为GNU风格编写的。这是一种AWK用法,而不是sed for i in $(<list_of_files) do awk '{if (FNR!=2) print $0; else { pr

我需要在目录中数百个文件的第二行插入一行特定文本(从而将文件中的其他行向下移动)。有关于如何实现这一点的快速Unix提示吗

sed -i -e '2iYour line here' /dir/*

请注意,
sed-i
语义因Unix风格而异,因此请检查您的
mansed
。这是为GNU风格编写的。

这是一种
AWK
用法,而不是
sed

for i in $(<list_of_files)
do
     awk '{if (FNR!=2) print $0; 
           else { print "new line"; print $0}}' $i > ${i}.tmp;
     mv ${i}.tmp $i;
done
$(${i}.tmp)中的i的
;
mv${i}.tmp$i;
完成

close(ARGV)
是在每个文件的开头重新启动行计数器
$所必需的。
默认情况下,它会计算文件中的行数。

您不认为值得做
-i.bak
来保护您免受删除大量数据的打字错误吗?(想象一下您忘记了
-p
)@Telemachus:当我做一个完整的目录时,我更喜欢先复制整个目录(例如cp-a dir{,.save});然后如果需要的话,我可以把它重新拷贝回来。我投票决不推荐没有备份的
perl-I
perl-I.bak
。这很容易,而且一旦你确定你的编辑没有错误,你就可以很容易地删除备份。
ls | xargs --replace=foo perl -i -ne 'print; print "second line text\n" unless $x++;' foo
perl -pi -we'print "extra line\n" if $. == 3; close ARGV if eof' files