删除sed中匹配行之前和之后的n行范围?

删除sed中匹配行之前和之后的n行范围?

在 vim 中我可以使用...

:g/match/-1d

...多次删除比赛前的多行...

...并将其与一些调用结合起来...

:g/match/+1d

...比赛结束后删除多行...

:g/match/-1d,+1d

...删除之前、之后和当前行...

sed 可以做同样的事情吗?

答案1

您要求 sed,但ed也可以这样做:

$ seq 10 > input
$ ed -s input <<< '/5/ -2, /5/ +2 d'$'\n'w
$ cat input
1
2
8
9
10

这告诉 ed 使用两个命令s默默地编辑文件:input

  1. 从与 regex 匹配的行开始5,减去两行,到与 regex 匹配的行结束5,加上两行,d删除该范围

(用 ANSI 转义换行符分隔$'\n'

  1. w将文件写回磁盘

答案2

如果区域不重叠,您可以使用

sed -zE 's/([^\n]*\n){2}([^\n]*match[^\n]*)(\n[^\n]*){3}/\2/g'

使用 GNU sed,删除匹配项之前的两行和之后的三行( 中的值{})。

对于一般sed实现,您没有 option -z,因此您需要使用方案收集缓冲区中的行H;1h;$!d,并且不能使用 执行“除换行符之外的所有操作” [^\n],因此您需要像这样的解决方法:

sed -E 'H;1h;$!d;x;y/\n#/#\n/;s/([^#]*#){2}([^#]*match[^#]*)(#[^#]*){3}/\2/g;y/\n#/#\n/'

两种解决方案都适用于模式空间中的整个文件,因此不要将其用于大文件。

相关内容