sed或awk:删除/注释3行之前的模式后的n行

sed或awk:删除/注释3行之前的模式后的n行,sed,Sed,要删除/注释图案前的3行,包括带有图案的线条,请执行以下操作: 我如何通过sed命令实现它 参考: 上面的参考博客有助于在模式匹配后实现这一点,但我需要在匹配前知道 define host{ use xxx; host_name pattern; alias yyy; address zzz;

要删除/注释图案前的3行,包括带有图案的线条,请执行以下操作:

我如何通过sed命令实现它

参考:

上面的参考博客有助于在模式匹配后实现这一点,但我需要在匹配前知道


define host{
use                             xxx;
host_name                       pattern;
alias                           yyy;
address                         zzz;
}
例如,下面的sed命令将在模式匹配后注释

sed -e '/pattern/,+3 s/^/#/' file.cfg

define host{
use                             xxx;
#host_name                       pattern;
#alias                           yyy;
#address                         zzz;
#}
像这样,我如何才能为before模式执行此操作


有人能帮我解决这个问题吗?

将文件反转,在后面注释3行,然后重新反转文件

tac文件| sed'/pattern/{s/^/;N;N;s/\N/&/g;}'| tac 虽然我认为awk更容易阅读:

tac文件| awk'/pattern/{c=3}c->0{$0=$0}1'| tac 如果允许tac: tac | sed-e'/pattern/,+3s/^/'| tac

如果不允许tac: sed-e'1!Gh、 美元!d’| sed-e’/pattern/,+3s/^/'| sed-e’1!Gh、 美元!d'
来源:

这可能适用于GNU-sed:

sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/s/^/#/mg;P;D' file
在图案空间中收集4行,如果最后一行包含图案,则在图案空间中每行的开头插入图案

要删除这4行,请使用:

sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/d;P;D' file
要删除图案前的3行,但不删除包含图案的行,请使用:

sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/d;P;D' file
sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/s/.*\n//;P;D'