【问题标题】:In-place deletion of a block of lines already found in a file using perl使用 perl 就地删除文件中已找到的行块
【发布时间】:2012-08-23 19:33:38
【问题描述】:

我希望能够在文件中找到由 start 和 end 关键字确定的行块,然后删除该块。我正在使用“if (/START/../END/)”来定位此块,但不确定如何删除此块中的行。我可以在上面的“if”中使用什么语句来实现这一点?

注意:不一定是真正的删除。我的意思是,它可以简单地用空白替换行。

PS:我是第一次使用 perl,如果这似乎是一个愚蠢的问题,请原谅我。我知道那里有很多类似的问题,但似乎没有人处理就地删除并建议将整个文件打印到另一个文件(不包括所需的块)之类的选项。

【问题讨论】:

  • 简单地收集所有 not 在 /START/ .. /END/ 块内的行,然后将它们写入文件?
  • 我可以做到,但是否有可能就地解决?

标签: perl


【解决方案1】:

Perl 让这很容易。

一行,就地删除pattern1pattern2之间的行:

perl -i -ne 'print unless /pattern1/../pattern2/' input_file

perlrun了解perl的各种命令行开关

【讨论】:

    【解决方案2】:

    你可以颠倒你的逻辑:

    use warnings;
    use strict;
    
    while (<DATA>) {
        print unless /START/ .. /END/;
    }
    
    =for output
    
    foo
    bar
    
    =cut
    
    
    __DATA__
    foo
    START
    goo
    END
    bar
    

    【讨论】:

    • 我需要以读写模式打开文件吗?它会打印同一个文件中的所有行吗?
    【解决方案3】:

    使用 sed:

    sed '/START/,/END/d' input_file
    

    修改原文件:

    sed -i '/START/,/END/d' input_file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2019-12-10
      • 1970-01-01
      相关资源
      最近更新 更多