使用 sed 删除行,如果它包含 1 个模式而不是另一个模式,则使用下面的行

Use sed to delete line, and the one below if it contains 1 pattern, but not another

找到了几个与我想要的相似的示例,但它们对我或其他人不适用(根据评论判断)。

我想要这个

#Hello my name is Chris
next line of random txt
#Hello my name is Bob
next line of random txt
Hello Ana is my name #
next line of random txt
Another Line

成为这个

#Hello my name is Chris
next line of random txt
Hello Ana is my name #
next line of random txt
Another Line

包含“#”但不包含 "Chris" 或 "Ana" 的行与其下方的行一起被删除。

给定输入:

#Hello my name is Chris
next line of random txt 1
#Hello my name is Bob
next line of random txt 2
Hello Ana is my name #
next line of random txt 3
Another Line

任一脚本:

sed -e '/#/ { /Chris/b' -e '/Ana/b' -e 'N; d; }' data

或脚本:

sed -E \
    -e '/#/ {
                 /(Chris|Ana)/b
                 N
                 d
            }' \
    data

生成:

#Hello my name is Chris
next line of random txt 1
Hello Ana is my name #
next line of random txt 3
Another Line

这似乎符合您的要求。第一个甚至不使用扩展正则表达式 (ERE) 语法,因此它具有最大的可移植性,但第二个表明可以轻松修改它以使用 ERE 语法。使用 BSD sed,分支 (b) 命令后不能有分号;接下来的内容必须在另一行或另一个 -e 参数中进行。没有明确标签的 b 表示 'branch to end of script'.

这可能适合您 (GNU sed):

sed '/Chris\|Ana/b;/#/!b;$!N;d' file

如果一行包含 ChrisAna 中断,即不做进一步处理,照常打印。同样,如果一行不包含 #。如果当前行不是最后一行,则获取下一行并将两者都删除。否则,如果它是最后一行,也将其删除。