【问题标题】:Delete all lines after a string but the last few删除字符串后的所有行,但最后几行
【发布时间】:2013-07-19 08:56:12
【问题描述】:

我有一个文件,其中包含一些行和一些数字。我想删除特定字符串之后的所有行,让我们说字符串是“角度”。我想删除角度后的所有线,我可以使用 sed 命令执行此操作,如下所示:

sed -n '/angles/q;p' input file

我的问题是,我想删除角度之后的所有线,但想保留最后四行?我怎样才能在 sed 中做到这一点?

【问题讨论】:

    标签: unix sed awk gawk


    【解决方案1】:

    以下内容应该适合您:

    tac inputfile | sed '5,/angles/d' | tac
    

    说明:反转文件,保留前 4 行并删除所有内容,直到遇到所需的模式。反转结果。

    【讨论】:

    • 这不是删除了里面有图案的那一行吗?
    • 命令 sed '5,/angles/d' 将删除从第 5 行到(包括)模式 angles.@user1407199 所说的 'I want to delete all the lines after angles' 的所有内容
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed '1,/angles/b;:a;$!{N;s/\n/&/4;Ta;D}' file
    

    打印出从第一行到遇到字符串angles 的所有行。然后制作一个四行的移动window 并将它们打印在文件末尾。

    【讨论】:

      【解决方案3】:

      在 awk 中:

      awk '{
           if(p!=1)print;
           else{a[NR]=$0}
           if($0~/angles/)p=1
           }
           END{
           for(i=NR-3;i<=NR;i++)print a[i]
           }' your_file
      

      测试如下:

      > cat temp
      wbj
      ergthet
      gheheh
      wergergkn   angles gerg
      er
      ergnmer
      rgnerk
      1
      2
      3
      4
      > awk '{if(p!=1)print;else{a[NR]=$0};if($0~/angles/)p=1}END{for(i=NR-3;i<=NR;i++)print a[i]}' temp
      wbj
      ergthet
      gheheh
      wergergkn   angles gerg
      1
      2
      3
      4
      > 
      

      【讨论】:

        【解决方案4】:
        awk -v size=$(wc -l < file) '
            /angles/       { skip=1 }
            NR >= (size-4) { skip=0 }
            !skip
        ' file
        

        【讨论】:

          【解决方案5】:

          我将假设您要查找的字符串可能不止一次出现,并且您只想要第一个。如果这是真的,那么反转文件并不是最好的策略。

          { sed '/angles/q' file; tail -4 file; } > result
          

          【讨论】:

            猜你喜欢
            • 2011-06-25
            • 2015-10-23
            • 2022-11-23
            • 2023-01-30
            • 2013-09-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多