我有一个档案。我想打印除最后一行之外的所有行。我们怎么能用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
答案 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