在文件中,我希望能够删除搜索模式周围的上下文.
根据上下文,我的意思是: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提醒)要在模式之前删除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
在每种情况下,都可以使用相对范围或偏移量和参数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如果范围超出文件的开头或结尾,这些命令将失败.