在文件中,我希望能够删除搜索模式周围的上下文。
根据上下文我的意思是: a)模式前的'n'行 b)模式后的'n'行 c)模式之后和之前的'n'行 d)通过删除图案线来做a,b,c e)在不删除图案线的情况下执行a,b,c
是否有某种方法可以使用:g/
或:%s
或其他方式来实现?
我可以用宏来做到这一点,但这不是我想要的。
以下是示例文字:
search_pattern random text 1
line below search pattern(delete me)
abc def
pqr stu
...
line above search pattern(delete me)
search_pattern random text 2
line below search pattern(delete me)
...
答案 0 :(得分:21)
基本上关键是
:d
可以在其后面加上一个数字参数,用于指定要删除的行数:/patt/+3
注意:
:g/patt/...
代替:/patt/...
(感谢Peter Rincker提醒)要删除模式前的n行,
:/patt/-n d n
删除模式之前的n行和模式行
:/patt/-n d p
其中p
= n
+ 1
要删除模式后的n行,
:/patt/+ d n
删除模式和模式行
之后的n行:/patt/ d p
其中p
= n
+ 1
删除模式之前的m行和模式之后的n行(因为它有2个命令,所以在这里作弊)
:/patt/-m d m | + d n
d
命令之后,光标将位于模式行删除模式之前的m行,模式行和模式之后的n行
:/patt/-m d q
其中q
= m
+ n
+ 1
答案 1 :(得分:6)
在每种情况下,都可以使用相对范围或偏移量以及d
的参数。逻辑上更直接的选择取决于具体情况;我倾向于在包容性案例中使用显式范围(因为您通常可以忽略范围的一半),否则使用d
的参数。
在模式之前,包括:
:g/regex/-3,d
:g/regex/-3d4
在模式之前,独占:
:g/regex/-3,-1d
:g/regex/-3d3
模式之后,包括:
:g/regex/,+3d
:g/regex/d4
在模式之后,独占:
:g/regex/+1,+3d
:g/regex/+1d3
之前和之后,包括:
:g/regex/-3,+3d
:g/regex/-3d7
之前和之后,独家:
:g/regex/-3,-1d|+1,+3d
:g/regex/-3d3|+1d3
请注意,如果范围超出文件的开头或结尾,这些命令将失败E16: Invalid range
。