【问题标题】:Perl: How do I remove the first line of a file without reading and copying whole filePerl:如何在不读取和复制整个文件的情况下删除文件的第一行
【发布时间】:2014-02-12 00:33:40
【问题描述】:

我确实在一个目录中有一大堆文件,并且我想从每个文件中删除第一行(包括回车)。我可以将整个文件读入一个字符串数组并将除第一个元素之外的所有元素写入一个新文件,但这对我来说看起来有点麻烦有没有更好的方法?哦,首选语言是 Perl。

【问题讨论】:

  • 这是不可能的,因为文件是如何存储的。您将始终必须读取整个文件,并写入除第一行之外的所有内容 - 操作系统没有其他方法。

标签: perl line


【解决方案1】:

试试这一款

perl -pi -e '$_ = "" if ( $. == 1 );' filename

我以前用过,应该是你所需要的。

【讨论】:

  • 基本上它说运行 perl,就地解析并执行以下代码行。以下行使用默认变量 $_ 在本例中是 -p 选项读入的行。美元。是文件名的行号。因此,如果行号为 == 1,则将该行的文本设置为“”。
【解决方案2】:

怎么样

tail +2

在外壳中?

(编辑:在较新的 Linux 中,您可能需要 tail -n +2(谢谢,GNU!:())

【讨论】:

    【解决方案3】:

    哦,首选语言是 Perl。

    有时sed 甚至比 perl 还要好 sed

    sed -i 1d *
    

    【讨论】:

      【解决方案4】:
      perl -n -i -e 'print unless $. == 1' myfile
      

      这类似于 stocherilac 的回答。

      但是,在任何情况下(以及所有其他给出的答案!)您总是在阅读完整的文件。无法避免这种情况,AFAIK。

      【讨论】:

      • 在 Windows 下的 MinGW 控制台中删除了我的文件“无法对 myfile 进行就地编辑:权限被拒绝”
      【解决方案5】:
      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;
      }
      

      【讨论】:

      • 请注意,这仍然需要读取和复制整个文件,但这是问题所固有的。我不知道有任何操作系统提供任何其他方式从文件开头删除数据。
      • Tie::File 是我的明显选择,因为它被明确编写用于有效地处理这个确切的问题类别。
      【解决方案6】:

      正如 Schwern 所指出的,以下操作没有像我最初认为的那样提前退出:

      perl -pi -e '$_ = q// and last if $. == 1;' myFile
      

      似乎一个不能毕竟避免处理整个文件。

      【讨论】:

      • 这并不像你想象的那样。如果是这样,它将违反文件在 Unix 上的工作方式。真正发生的是$_ = "" 总是错误的,所以$_ = "" and last0 and last 相同。它短路并且从不调用last。你写过:perl -pi e '$_ = q// if $. == 1' myFile 这是一个不打印第一行的聪明方法,但它肯定会读取整个文件。使用-MO=Deparse 运行以获取代码并在调试器中运行以查看。 do { this; that; } if something 是一个更安全的结构。
      • @Schwern:我的错。您的解释需要一段时间才能深入人心,但我明白您的意思。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2019-07-09
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多