【发布时间】:2014-02-12 00:33:40
【问题描述】:
我确实在一个目录中有一大堆文件,并且我想从每个文件中删除第一行(包括回车)。我可以将整个文件读入一个字符串数组并将除第一个元素之外的所有元素写入一个新文件,但这对我来说看起来有点麻烦有没有更好的方法?哦,首选语言是 Perl。
【问题讨论】:
-
这是不可能的,因为文件是如何存储的。您将始终必须读取整个文件,并写入除第一行之外的所有内容 - 操作系统没有其他方法。
我确实在一个目录中有一大堆文件,并且我想从每个文件中删除第一行(包括回车)。我可以将整个文件读入一个字符串数组并将除第一个元素之外的所有元素写入一个新文件,但这对我来说看起来有点麻烦有没有更好的方法?哦,首选语言是 Perl。
【问题讨论】:
试试这一款
perl -pi -e '$_ = "" if ( $. == 1 );' filename
我以前用过,应该是你所需要的。
【讨论】:
怎么样
tail +2
在外壳中?
(编辑:在较新的 Linux 中,您可能需要 tail -n +2(谢谢,GNU!:())
【讨论】:
哦,首选语言是 Perl。
有时sed 甚至比 perl 还要好 sed:
sed -i 1d *
【讨论】:
perl -n -i -e 'print unless $. == 1' myfile
这类似于 stocherilac 的回答。
但是,在任何情况下(以及所有其他给出的答案!)您总是在阅读完整的文件。无法避免这种情况,AFAIK。
【讨论】:
use Tie::File qw();
for my $filename (glob 'some_where/some_files*') {
tie my @file, 'Tie::File', $filename or die "Could not open $filename: $!";
shift @file;
}
【讨论】:
正如 Schwern 所指出的,以下操作没有像我最初认为的那样提前退出:
perl -pi -e '$_ = q// and last if $. == 1;' myFile
似乎一个不能毕竟避免处理整个文件。
【讨论】:
$_ = "" 总是错误的,所以$_ = "" and last 与0 and last 相同。它短路并且从不调用last。你写过:perl -pi e '$_ = q// if $. == 1' myFile 这是一个不打印第一行的聪明方法,但它肯定会读取整个文件。使用-MO=Deparse 运行以获取代码并在调试器中运行以查看。 do { this; that; } if something 是一个更安全的结构。