2013-04-22 72 views
5

說我有這樣的臺詞:搜索和替換,而無需耗費你要搜索的內容

'alpha' 123 
'beta' 678 
'alpha' 998 
'gamma' 212 

而且使用搜索&在VIM替換正則表達式,把它變成這樣:

'alpha' 123 : alpha 
'beta' 678 : beta 
'alpha' 998 : alpha 
'gamma' 212 : gamma 

基本上,搜索將不會取代它正在搜索的內容,而只是將其用於其他內容。在我的腦海中,這應該工作:

:g/'\(.*\)'/s/$/: \1/g 

但那並沒有這樣做。我如何不消費我正在尋找的東西,但保留它以供使用?

回答

1

可以在替換命令直接做到這一點,使用\zs這是真的 像零個寬度匹配建設有用的東西(不 「消費」)。

:%s/'\(.*\)'.*\zs/ : \1 

\zs標誌着比賽的開始。這就像「在這裏開始比賽 」。因此,首先捕獲括號的內容,然後額外匹配所有直到行末的所有內容,並且\zs現在重置 與該點的匹配,意味着根本不是匹配的一部分,但是捕獲了包袱的內容。

替換部分用:和 代替匹配組的行結束位置。

:h \zs

+1

這是exac真是我所希望的!謝謝! – Bromide 2013-04-22 17:03:54

0

這個命令應該工作:

:%s/\v'(\w*)'.*/\0 : \1 

(當然,它確實在這裏與您的示例文本)

5

最初的比賽更換不捕獲g;它僅用於搜索的分組。而是利用這一點,這也太簡單了一點:

%s/'\(.*\)'.*/& : \1/ 

&取代了匹配的一切。

+0

我正在使用sidyll給出的例子的一個變體,但是這也是不錯的:-) – Bromide 2013-04-22 17:06:19

0

宏的工作你太例如:在第1行的開頭(沒有vim的測試,但應該工作。)

光標:

qqyi'A : <esc>pjq 

然後[email protected](x是你想要做多少次)