2015-10-13 75 views
1

我有由兩個部分組成(產品&向量)像這樣的文件的矢量線:具有名稱替換索引在一系列含有索引

One 
Two 
Three 
Four 
Five 
Six 
Seven 
Eight 
Nine 

Vectors 
------- 
[1,1,4,1] 
[6,3,9,8,2] 
[5,7,7,4,6,6] 

我想修改載體部分,像這樣:

Vectors 
------- 
[One,One,Four,One] 
[Six,Three,Nine,Eight,Two] 
[Five,Seven,Seven,Four,Six,Six] 

我想專門在Vim中完成它。

有沒有一種方法可以自動替換索引?

索引表示項目定義的行號。

我已經做了幾個嘗試混合:s命令與\ = line()函數來檢索項目,但沒有去處。

回答

4

當然你可以只用一點Vim腳本。

:s/\v\d+/\=getline(str2nr(submatch(0)))/g 

即,

  • :s ubstitute
  • 數字任何序列\v\d+
  • 用表達getline(str2nr(submatch(0)))(取整的比賽,其轉換成數字的值,則得到相應行的內容),
  • 並且對行g中的所有匹配進行了詳盡的操作。

使用可視化模式,以替換命令適用於您的「矢量」部分:

:'<,'>s/\v\d+/\=getline(str2nr(submatch(0)))/g 
+0

我喜歡聰明的使用'函數getline()'獲得行的值 –

+0

很不錯的。謝謝。 – FZed

+0

我很抱歉問,但爲什麼'str2nr()'是必要的?它適用於我,即使像':s/\ v \ d +/\ = getline(submatch(0))/ g'。 – ryuichiro

0

您可以使用替換子替換表達式。

首先創建鍵/值對的字典:

let dict = { '1': 'One', '2': 'Two', '3': 'Three', '4': 'Four', '5': 'Five', '6': 'Six', '7': 'Seven', '8': 'Eight', '9': 'Nine'} 

現在運行在正文中的替代:

%s/\d/\=get(dict, submatch(0), submatch(0))/g 

子替換表達式將查找的價值字典,dict,通過get()函數使用匹配,submatch(0)

如需更多幫助,請參見:

:h sub-replace-expression 
:h get(
:h dict