【问题标题】:Can you use sed to delete match and only certain lines after?您可以使用 sed 删除匹配项并仅删除某些行吗?
【发布时间】:2017-08-02 21:36:07
【问题描述】:

是否可以使用 sed 搜索特定的代码块并删除匹配项,并且只删除它之后的特定行?

例如,如果我有一个这样的块,并且想要删除特殊标记 1 并且只删除它之后的第二行:

special marker 1
text 1
text 2
text 3

我可以使用 sed 搜索块的实例并得出:

text 1
text 3

我知道以下命令:

sed -i '/START/,/END/ {/special marker 1/{n;n;N;d;}}' filename;

但是,这个命令只给我留下:

text 1

所以它似乎将下一行操作加倍并删除。有什么方法可以修复此命令或以其他方式执行此操作?

【问题讨论】:

    标签: linux bash sed


    【解决方案1】:

    告诉sed 打印跳过这两行:

    sed -ni '/special marker 1/{n;p;n;n};p' filename
    

    当你只想输出两行时,命令可以替换为

    sed -ni '/special marker 1/{n;p;n;n;p}' filename
    

    【讨论】:

      【解决方案2】:
      sed -i '/START/,/END/ {/special marker 1/{N;N;D};P;d}' filename
      

      【讨论】:

      • 谢谢,这似乎与我的想法最接近。
      【解决方案3】:

      使用awk 你可以这样做:

      awk '/special marker 1/{p=NR; next} p && NR==p+2{p=0; next} 1' file
      text 1
      text 3
      

      【讨论】:

        【解决方案4】:

        也尝试一下 awk 解决方案。

        解决方案一:

        awk '/special marker 1/{;if(getline var){print var;if(getline var1){next};next}} 1'   Input_file
        

        解决方案二:

        awk '/special marker 1/{getline;if(NF){print};if(NF){;getline};next} 1'  Input_file
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-04
          • 1970-01-01
          • 2021-08-26
          • 1970-01-01
          • 2022-01-26
          • 1970-01-01
          相关资源
          最近更新 更多