Sadi Asked: 2023-11-18 22:20:21 +0800 CST2023-11-18 22:20:21 +0800 CST 2023-11-18 22:20:21 +0800 CST 删除下面的行,不包括具有匹配模式的行 772 可以使用sed '/pattern/Q'或sed '/pattern/,$d'来删除匹配模式下面的行,但它也会删除包含匹配模式的行。 如何排除包含匹配模式的行,只删除其下面的行? shell-script 5 个回答 Voted Best Answer steeldriver 2023-11-18T22:52:19+08:002023-11-18T22:52:19+08:00 使用GNU sed 特有的命令Q之一使这变得过于复杂: Q [退出代码] 该命令仅接受一个地址。 该命令与q相同,但不会打印模式空间的内容。与 q 一样,它提供了向调用者返回退出代码的能力。 如果您不想要这种特殊行为(即您确实想在退出之前打印匹配模式空间的内容),请使用常规q命令: sed '/pattern/q' bxm 2023-11-18T22:35:23+08:002023-11-18T22:35:23+08:00 这应该可以做到 sed -n '/pattern/{p;q};p' 该-n开关sed默认不打印。 表示{p;q}如果观察到该模式,则打印该行并退出。 ;p当尚未找到匹配项时,默认操作是打印。 Prabhjot Singh 2023-11-18T22:41:17+08:002023-11-18T22:41:17+08:00 使用awk: $ awk 'NR==1,/pattern/' pattern如果找不到,以下命令将不打印任何内容。 $ awk '{a = a $0 ORS}/pattern/{printf "%s", a}' 使用pcregrep: $ pcregrep -M "(.*\n)*.*pattern" Ed Morton 2023-11-18T23:19:27+08:002023-11-18T23:19:27+08:00 对于这样的任务,为了简单、清晰和可移植性,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 或者使用print-with-sed-or-awk-a-line-following-a-matching-pattern 中的惯用语“f” : $ seq 10 | awk 'c&&c--{next} /3/{c=4} {print}' 1 2 3 8 9 10 这些命令都可以在每个 Unix 机器上使用任何 awk 来工作,并且做任何您可能想做的类似事情都很简单。 jubilatious1 2023-11-19T18:48:17+08:002023-11-19T18:48:17+08:00 使用Perl: ~$ seq 10 | perl -pe 'last if /3/' 1 2 #OR: ~$ seq 10 | raku -ne '/3/ ? last : print $_;' 1 2 使用Raku(以前称为 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自动打印在输入上逐行运行代码;这些标志在输入上逐行运行代码,而不自动打印。在上面的所有四个答案中,都使用退出逐行循环。Perl 和 Raku 的三元运算符之间存在细微差别,主要是因为 Raku在语言的其他方面部署了冒号。-nelast: https://perldoc.perl.org https://docs.raku.org
使用GNU sed 特有的命令
Q
之一使这变得过于复杂:如果您不想要这种特殊行为(即您确实想在退出之前打印匹配模式空间的内容),请使用常规
q
命令:这应该可以做到
该
-n
开关sed
默认不打印。表示
{p;q}
如果观察到该模式,则打印该行并退出。;p
当尚未找到匹配项时,默认操作是打印。使用
awk
:pattern
如果找不到,以下命令将不打印任何内容。使用
pcregrep
:对于这样的任务,为了简单、清晰和可移植性,awk 是比 sed 更好的选择,例如删除与正则表达式匹配的某行下面的所有行(
3
在本例中为 a):或者,如果您还想删除匹配行,则将测试正则表达式的位置移动到打印之前而不是打印之后:
或者我们可以删除 3 出现后的 4 行:
或者使用print-with-sed-or-awk-a-line-following-a-matching-pattern 中的惯用语“f” :
这些命令都可以在每个 Unix 机器上使用任何 awk 来工作,并且做任何您可能想做的类似事情都很简单。
使用Perl:
使用Raku(以前称为 Perl_6):
sed
Perl 和 Raku 借用了和 的许多命令行标志约定awk
。在标志上方,通过-pe
自动打印在输入上逐行运行代码;这些标志在输入上逐行运行代码,而不自动打印。在上面的所有四个答案中,都使用退出逐行循环。Perl 和 Raku 的三元运算符之间存在细微差别,主要是因为 Raku在语言的其他方面部署了冒号。-ne
last
:
https://perldoc.perl.org
https://docs.raku.org