Bash 使用sed删除行,如果下面的行包含一个模式,则删除该行,但不删除另一个

Bash 使用sed删除行,如果下面的行包含一个模式,则删除该行,但不删除另一个,bash,sed,bsd,Bash,Sed,Bsd,发现了一些与我想要的相似的例子,但它们不适合我,或者从评论中判断其他人 我想要这个 #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 H

发现了一些与我想要的相似的例子,但它们不适合我,或者从评论中判断其他人

我想要这个

#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
或者脚本:

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
表示“从分支到脚本末尾”。

这可能适用于您(GNU-sed):


如果一行包含
Chris
Ana
break,即不进行进一步处理并正常打印。同样,如果一行不包含
#
。如果当前行不是最后一行,则获取下一行并同时删除这两行。否则,如果它是最后一行,也将其删除。

Awesome再次完美。谢谢你的帮助!使用第一个示例,您还可以将#1调整为
sed'/{/\(Chris\'124; Ana\)/b;N;d;}数据
(以享受尖桩围栏效果)sed仅用于
s/old/new
。对于其他任何东西,您都应该使用awk。如果
#Hello my name is Bob
后面紧跟着一行相同的内容,则当前发布的所有sed解决方案(包括已接受的答案)都将失败。如果这是一个问题,请更新您的问题,将该情况包括在输入中。