【问题标题】:Deleting N lines from every start point从每个起点删除 N 行
【发布时间】:2011-03-02 22:26:46
【问题描述】:

如何删除从我看到的每个单词实例开始的 6 行?

【问题讨论】:

    标签: linux perl scripting


    【解决方案1】:

    我认为这个 sed 命令会做你想做的事:

    sed '/bar/,+5d' input.txt
    

    它会删除包含文本 bar 以及以下五行的任何行。

    如上运行以查看输出。当您知道它工作正常时,请使用开关--in-place=.backup 来实际执行更改。

    【讨论】:

    • +1 OP应该记住,这会删除“从前到后”,也就是说,如果bar出现在bar之后的五行之内,那么后面的bar将在它之前被删除有机会“定义”六行删除。可能可以接受,但要记住一些事情。
    • - 这里有一个 awk 片段 - 想得更好。
    【解决方案2】:

    这个简单的 perl 脚本将删除包含单词“DELETE6”的每一行和 5 个连续的行(总共 6 个)。它还将以前版本的文件保存在 FILENAME.bak 中。运行脚本:

    perl script.pl FILE_TO_CHANGE

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $remove_count = 6;
    my $word = "DELETE6";
    
    local $^I = ".bak";
    my $delete_count = 0;
    while (<>) {
        $delete_count = $remove_count if /$word/; 
        print if $delete_count <= 0;
        $delete_count--;
    }
    

    HTH

    【讨论】:

      【解决方案3】:
      perl -i.bak -n -e '$n ++; $n = -5 if /foo/; print if $n > 0' data.txt
      

      【讨论】:

        【解决方案4】:
        perl -ne 'print unless (/my_word/ and $n = 1) .. ++$n == 7'
        

        请注意,如果my_word 出现在跳过的行中,则不会重置计数器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-03
          • 1970-01-01
          • 2012-02-18
          • 2011-07-14
          • 1970-01-01
          • 2013-10-02
          • 2015-05-24
          • 1970-01-01
          相关资源
          最近更新 更多