如何在vim中删除搜索模式周围的行?

时间:2013-06-24 18:38:37

标签: vim

在文件中,我希望能够删除搜索模式周围的上下文。

根据上下文我的意思是: 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)
...

2 个答案:

答案 0 :(得分:21)

基本上关键是

  • :d可以在其后面加上一个数字参数,用于指定要删除的行数
  • 您可以在模式后指定偏移,例如:/patt/+3

注意:

  • 如果您对所有模式实例执行此操作,请使用:g/patt/...代替:/patt/...(感谢Peter Rincker提醒)
  • 以下ex命令中的所有空格都是可选的,为了清楚起见,我把它放在那里。

要删除模式前的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