2015-10-13 73 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