【问题标题】:How to delete the line that matches a pattern and the line after it with sed?如何使用 sed 删除与模式匹配的行及其后的行?
【发布时间】:2013-07-26 21:13:36
【问题描述】:

我有一个看起来像这样的文件:

good text
good text
FLAG bad text
bad text
good text
good text
good test
bad Text FLAG bad text
bad text
good text

我需要删除任何包含“FLAG”的行并且总是也需要删除紧跟在“FLAG”行之后的一行。

“FLAG”行不规则地出现,我不能依赖任何类型的行号策略。

有谁知道如何使用 sed 做到这一点?

【问题讨论】:

    标签: linux unix sed


    【解决方案1】:

    使用GNU 版本的 的扩展:

    sed -e '/FLAG/,+1 d' infile
    

    它产生:

    good text
    good text
    good text
    good text
    good test
    good text
    

    【讨论】:

    • 完美。我正在尝试类似的方法,但无法正确猜测语法。谢谢!
    【解决方案2】:

    这可行,并且不依赖于任何扩展:

    sed '/FLAG/{N
    d
    }' infile
    

    N 将下一行读入模式空间,然后d 删除模式空间。

    【讨论】:

    • 非常感谢。希望我能在这里接受两个答案。给你一个赞成票。
    【解决方案3】:

    这是awk的一种方式:

    awk '/FLAG/{f=1;next}f{f=0;next}1' file
    

    awk '/FLAG/{getline;next}1' file
    

    【讨论】: