13

In a file, I want to be able to delete context around a search pattern.

By context I mean: a) 'n' lines before the pattern b) 'n' lines after the pattern c) 'n' lines after and before the pattern d) do a,b,c by deleting the pattern line as well e) do a,b,c without deleting the pattern line

Is there some way to do it using :g/ or :%s or some other way? I can do this with macros, but that's not what I am looking for.

Here is sample text:

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)
...
4

2 回答 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 行(这里有点作弊,因为它是 2 个命令),

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

删除模式前的 m 行、模式行和模式后的 n 行

:/patt/-m d q

其中q= m+ n+1

于 2013-06-24T18:58:24.433 回答
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: Invalid range如果范围超出文件的开头或结尾,这些命令将失败。

于 2013-06-24T19:19:06.010 回答