删除下面的行,不包括具有匹配模式的行

删除下面的行,不包括具有匹配模式的行

可以使用sed '/pattern/Q'sed '/pattern/,$d'来删除匹配模式下面的行,但它也会删除包含匹配模式的行。

如何排除包含匹配模式的行,只删除其下面的行?

答案1

您使用 使这变得过于复杂Q,这是其中之一GNU sed 特有的命令:

Q [退出代码]

该命令仅接受一个地址。

该命令与q相同,但不会打印模式空间的内容。与 q 一样,它提供了向调用者返回退出代码的能力。

如果你想要这种特殊的行为(即你如果想在退出之前打印匹配的模式空间的内容),请使用常规q命令:

sed '/pattern/q'

答案2

这应该可以做到

sed -n '/pattern/{p;q};p'

-n开关默认sed不打印。

表示{p;q}如果观察到该模式,则打印该行并退出。

;p当尚未找到匹配项时,默认操作是打印。

答案3

对于这样的任务,为了简单、清晰和可移植性,awk 是比 sed 更好的选择,例如删除与正则表达式匹配的某行下面的所有行(3在本例中为 a):

$ seq 10 | awk '{print} /3/{exit}'
1
2
3

或者,如果您还想删除匹配行,则将测试正则表达式的位置移动到打印之前而不是打印之后:

$ seq 10 | awk '/3/{exit} {print}'
1
2

或者我们可以删除 3 出现后的 4 行:

$ seq 10 | awk 'NR>n{print} /3/{n=NR+4}'
1
2
3
8
9
10

或者使用成语“f”使用 sed-或 awk-a-line-follow-a-matching-pattern 进行打印:

$ seq 10 | awk 'c&&c--{next} /3/{c=4} {print}'
1
2
3
8
9
10

这些命令都可以在每个 Unix 机器上使用任何 awk 来工作,并且做任何您可能想做的类似事情都很简单。

答案4

使用珀尔:

~$ seq 10 | perl -pe 'last if /3/'
1
2

#OR:

~$ seq 10 | raku -ne '/3/ ? last : print $_;'
1
2

使用(以前称为 Perl_6):

~$ seq 10 | perl -pe 'last if /3/'
1
2

#OR:

~$ seq 10 | raku -ne '/3/ ?? (last) !! (put $_);'
1
2

sedPerl 和 Raku 借用了和的许多命令行标志约定awk。在标志上方-pe,在输入上逐行运行代码自动打印;标志-ne在输入上逐行运行代码没有自动打印。在上面的所有四个答案中,last都使用退出逐行循环。 Perl 和 Raku 的三元运算符之间存在细微差别,主要是因为 Raku:在语言的其他方面部署了冒号。

https://perldoc.perl.org
https://docs.raku.org

相关内容