使用 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
如果一行包含 Chris
或 Ana
中断,即不做进一步处理,照常打印。同样,如果一行不包含 #
。如果当前行不是最后一行,则获取下一行并将两者都删除。否则,如果它是最后一行,也将其删除。
找到了几个与我想要的相似的示例,但它们对我或其他人不适用(根据评论判断)。
我想要这个
#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
如果一行包含 Chris
或 Ana
中断,即不做进一步处理,照常打印。同样,如果一行不包含 #
。如果当前行不是最后一行,则获取下一行并将两者都删除。否则,如果它是最后一行,也将其删除。