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

时间:2018-05-13 00:03:54

标签: 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
Hello Ana is my name #
next line of random txt
Another Line

包含"#"的行但不是"克里斯"或者" Ana"被删除以及他们下面的行。

2 个答案:

答案 0 :(得分:3)

给定输入:

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

产生

sed

这似乎符合您的规格。第一个甚至不使用扩展正则表达式(ERE)语法,因此它最大程度上是可移植的,但第二个表明可以很容易地修改它以使用ERE语法。使用BSD b,分支(-e)命令后不能有分号;接下来的内容必须在另一行或另一个b论证中。没有显式标签的Option Explicit Sub Calculate(Total As Variant, X As Variant, Y As Variant, Z As Variant) If Validity(Total, X, Y, Z)) Then ‘since Validity returns a boolean, you can simply check it MsgBox "Yes, Proceed" Else MsgBox "No, abort" End If End Sub Function Validity(Total As Variant, X As Variant, Y As Variant, Z As Variant) As Boolean Validity = CInt(Total) < CInt(X*Y*Z) End Function 表示“分支到脚本结束”。

答案 1 :(得分:0)

这可能适合你(GNU sed):

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

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