【问题标题】:Perl one-liner prints everything except the last linePerl 单行打印除最后一行之外的所有内容
【发布时间】:2019-07-13 01:31:02
【问题描述】:

我有一个文件。我想打印除最后一行之外的所有行。我们如何使用 Perl 单行代码做到这一点?

这不起作用:

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

我的错,这是有效的。我没有仔细查看我的输出。

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

【问题讨论】:

  • 我想你的意思是“除了”最后一行?
  • 在什么情况下不工作?
  • 最后一行总是出乎我的意料,就像冰箱里最后一瓶啤酒一样:-(
  • 如果您想在纯 perl 中执行此操作,我建议您延迟一行并在新一行进入时打印最后一行 - 在您不打印缓冲区中的一行时。
  • 抱歉,我没有仔细查看我的输出。它有效

标签: perl


【解决方案1】:

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

head --lines=-1 filename

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

对于 Perl,您的代码基本正确,但无需涉及 cat。否则,您将读取该文件两次。可以直接传入文件名。同样-l 在那里实际上什么都不做,从输入中剥离换行符并将其放回输出中。最后,不需要-a,因为这会浪费地将每一行拆分为未使用的@F

perl -ne 'print if not eof' filename

【讨论】:

  • +1 完整的解释和使用 head 的建议以及不需要的各种参数的建议。
【解决方案2】:

我只能说……

它可以在我的电脑上运行!

(边缘射击!)

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

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

不带参数的 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

【讨论】:

    【解决方案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'
    

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

    【讨论】:

      【解决方案4】:
      perl -ne 'print $last;$last=$_' 
      

      【讨论】:

      • 如果我们在打高尔夫球,perl -pe'($x,$_)=($_,$x)'
      • 或者,更一般地,打印除最后 N 行之外的所有行:perl -pe 'push @s, $_; $_ = @s &gt; N ? shift(@s) : q{}'
      • @ikegami: perl -pe'eof&amp;&amp;last'
      【解决方案5】:
      perl -ne 'print unless eof'
      

      但是为什么它必须是 Perl 呢? -

      sed '$d'
      

      高尔夫版本:

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

      【讨论】:

      • 我喜欢 perl 因为正则表达式。我用的是perl。
      • 好吧,如果你喜欢打高尔夫球,perl -ne'print if!eof' 会更短;-)
      【解决方案6】:

      跟进@sleeplessnerd:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-26
        • 2018-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        相关资源
        最近更新 更多