在 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
- 从与 regex 匹配的行开始
5
,减去两行,到与 regex 匹配的行结束5
,加上两行,d
删除该范围
(用 ANSI 转义换行符分隔$'\n'
)
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/'
两种解决方案都适用于模式空间中的整个文件,因此不要将其用于大文件。