perl one-liner打印除最后一行之外的所有内容

时间:2011-09-04 01:31:53

标签: perl

我有一个档案。我想打印除最后一行之外的所有行。我们怎么能用perl one liner做到这一点?

这不起作用:

cat file|perl -lane 'print if not eof()'

由于 SR

我的坏,这是有效的,我没有密切关注我的输出。

seq 1 6  |perl -lane 'print if not eof()'
1
2
3
4
5

6 个答案:

答案 0 :(得分:14)

如果需要在命令行上执行此操作,可以使用shell命令head。负数行将显示除最后N行之外的所有行。

head --lines=-1 filename

这是一个GNU扩展,不适用于BSD头,例如OS X附带的库存头。

对于Perl,您的代码基本上是正确的,但不需要涉及cat。否则你正在读取文件两次。您可以直接传递文件名。同样-l在那里有效地做任何事情,从输入中剥离换行并将其重新放回输出。最后,不需要-a,因为这会浪费地将每一行拆分为@F,但不使用。

perl -ne 'print if not eof' filename

答案 1 :(得分:6)

我只能说......

它适用于我的电脑!

(边敲击!)

那么,你到底得到了什么?这是错误信息还是程序运行?它会打印出任何行吗?

eof()eof之间存在差异,这可能会引起您的一些担忧(尽管两者都适用于我的系统)。根据{{​​3}}:

  

没有参数的eof使用最后读取的文件。使用带空括号的eof()是不同的。它指的是由命令行中列出的文件形成的伪文件,并通过<>进行访问。运营商。由于<>没有明确打开,因为正常的文件句柄是<>之前的eof()已被使用将导致检查@ARGV以确定输入是否可用。类似地,<>之后的eof()。已返回文件结尾将假定您正在处理另一个@ARGV列表,如果您尚未设置@ARGV,则将从STDIN读取输入;请参阅perlop中的I / O操作符

顺便说一句,不需要cat。这是相同的,它可以避免创建额外的过程:

perl -ne 'print if not eof()' < file

而且,你应该能够做到这一点:

perl -ne 'print if not eof()' file

答案 2 :(得分:3)

也许你一直在读这个? Famous Perl One-Liners Explained

这些对我来说都适用于Perl 5.10:

cat myfile | perl -ne 'print if not eof'
cat myfile | perl -lane 'print if not eof'

您所看到的行为有什么问题?

答案 3 :(得分:3)

perl -ne 'print $last;$last=$_' 

答案 4 :(得分:1)

perl -ne'print unless eof'

但为什么它必须是perl?

sed '$d'

编辑高尔夫版本:

perl -ne'print if!eof'
sed \$d

答案 5 :(得分:0)

跟进@sleeplessnerd:

  

perl -ne'BEGIN {$ l = undef}; print $ l if(defined $ l); $ l = $ _'file.txt