2013-06-24 39 views
7

在文件中,我希望能夠刪除搜索模式的上下文。如何在vim中刪除搜索模式周圍的線?

通過上下文我的意思是: 一個) 'N' 之前的圖案 b線) 'N' 線的圖案 c)之後 'N' 線之後並且在圖案 d)之前做A,B,C通過刪除圖案線以及e)做a,b,c而不刪除圖案線

有沒有辦法使用:g/:%s:%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) 
... 

回答

15

基本上關鍵是

  • :d可以採取一個數字參數它指定的行數之後刪除
  • 你可以指定一個在模式之後偏移,例如:/patt/+3

注:

  • 如果你這樣做是對模式的所有實例,在EX使用:g/patt/...,而不是:/patt/...(感謝Peter Rincker的提醒)
  • 所有空間下面的命令是可選的,爲了清楚起見,我把它放在那裏。

到圖案之前刪除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級的命令),因爲之後的第一個d命令,

:/patt/-m d m | + d n 
  • 工作的,光標將是對圖案線

到圖案時,圖案線之前刪除m行和n的圖案後線

:/patt/-m d q 

其中q = m + n + 1

+2

這對於模式的1個實例非常適用。只需爲所有模式添加':g'。例如:':g/pat/-3d3'。請參閱':h:g'獲取更多幫助。 –

4

在每種情況下,都可以使用相對範圍或偏移量以及參數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