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