【问题标题】:Sed: delete lines after a pattern for all occurencesSed:删除所有出现的模式后的行
【发布时间】:2023-03-09 18:32:01
【问题描述】:

我需要一些关于 sed 的帮助。我正在尝试删除文件中所有出现的模式 之后的 3 行。我愿意

sed '/pattern/,+3d' file.

这只会删除 3 行和第一次出现的模式,但只会删除第二次出现的模式,而不是真正令人困惑的行。谁能帮我解决我做错了什么?

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。

标签: bash sed


【解决方案1】:

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

sed -n '/regexp/{p;:a;n;//ba;n;//ba;n;//ba;d};p' file

如果遇到正则表达式,打印当前行,然后删除以下 3 行。在阅读这 3 行时,任何时候都会出现正则表达式,重置计数。

如果还要删除正则表达式,请使用:

sed -n '/regexp/{:a;n;//ba;n;//ba;n;//ba;d};p' file

【讨论】:

    【解决方案2】:

    我认为 awk 更适合这项任务。例如,

    $ cat file
    1
    2
    4
    a0
    1
    a1
    1
    2
    3
    4
    5
    

    运行

    awk '
    flag   { i ++            }
    i == 3 { flag = 0        }
    !flag
    /a/    { flag = 1; i = 0 }
    ' file
    

    输出

    1
    2
    4
    a0
    3
    4
    5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2021-01-08
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多