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

Ama*_*ain 13 vim

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

根据上下文,我的意思是:a)模式之前的'n'行b)模式之后的'n'行c)模式之后和之前的'n'行通过删除模式行来执行a,b,c )执行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)
...
Run Code Online (Sandbox Code Playgroud)

dou*_*own 24

基本上关键是

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

笔记:

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

要在模式之前删除n行,

:/patt/-n d n
Run Code Online (Sandbox Code Playgroud)

删除图案图案线之前的n 行

:/patt/-n d p
Run Code Online (Sandbox Code Playgroud)

其中p= n+ 1


要删除模式后的n行,

:/patt/+ d n
Run Code Online (Sandbox Code Playgroud)

删除图案图案线后的n 行

:/patt/ d p
Run Code Online (Sandbox Code Playgroud)

其中p= n+ 1


删除模式之前的m行和模式之后的n行(因为它是2个命令,所以在这里作弊),

:/patt/-m d m | + d n
Run Code Online (Sandbox Code Playgroud)
  • 这是有效的,因为在第一个d命令之后,光标将在图案线上

要删除图案之前的m行,图案线以及图案之后的n行

:/patt/-m d q
Run Code Online (Sandbox Code Playgroud)

其中q= m+ n+1

  • 这适用于1个模式实例.只需为所有模式添加`:g`即可.示例:`:g/pat/-3d3`.请参阅`:h:g`以获取更多帮助. (3认同)

Nik*_*vda 6

在每种情况下,都可以使用相对范围或偏移量和参数d.逻辑上更直接的选择取决于具体情况; 我倾向于在包容性案例中使用显式范围(因为你通常可以省略一半的范围),d否则就是一个参数.

在模式之前,包括:

:g/regex/-3,d
:g/regex/-3d4
Run Code Online (Sandbox Code Playgroud)

在模式之前,独家:

:g/regex/-3,-1d
:g/regex/-3d3
Run Code Online (Sandbox Code Playgroud)

模式之后,包括:

:g/regex/,+3d
:g/regex/d4
Run Code Online (Sandbox Code Playgroud)

在模式之后,独家:

:g/regex/+1,+3d
:g/regex/+1d3
Run Code Online (Sandbox Code Playgroud)

之前和之后,包括:

:g/regex/-3,+3d
:g/regex/-3d7
Run Code Online (Sandbox Code Playgroud)

之前和之后,独家:

:g/regex/-3,-1d|+1,+3d
:g/regex/-3d3|+1d3
Run Code Online (Sandbox Code Playgroud)

请注意,E16: Invalid range如果范围超出文件的开头或结尾,这些命令将失败.