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

13

我想在文件中删除与搜索模式相关的上下文。

所谓的上下文是: 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个回答

27

基本上关键在于:

  • :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行(这里有点作弊,因为需要用两个命令),

:/patt/-m d m | + d n
  • 这是行得通的,因为在第一个d命令之后,光标将位于模式所在的那一行

要删除模式前面的m行、模式行以及模式后面的n行

  • 这是行得通的,因为在第一个d命令之后,光标将位于模式所在的那一行

要删除模式前面的m行、模式行以及模式后面的n行

:/patt/-m d q

其中 q = m + n + 1


3
对于一个匹配模式,使用这个方法效果很好。如果要对所有的模式都生效,只需添加 :g。例如::g/pat/-3d3。详见:h :g获取更多帮助信息。 - Peter Rincker

9

在每种情况下,都可以使用相对范围或偏移量和 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:无效范围”的错误失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接