将匹配的模式替换为数组列表

时间:2013-05-24 20:23:50

标签: vim replace

我有这样的HTML代码。

<tr>
  <td>$value</td>
  <td>$value</td>
  <td>$value</td>
</tr>

我希望使用数组$value中的值更改所有new_value = ['Noodle', 'Rice', 'Pizza']我认为如果做一些宏的事情就会解决,这是我的第一次尝试。

:let new_value = ['Noodle', 'Rice', 'Pizza']
:let i = 0
qq
/$value
:s/$value/\=new_value[i]/
:let i += 1
q

但是当我运行这个宏时,它运行不顺畅。

1 个答案:

答案 0 :(得分:4)

您需要在宏中向下移动一行。目前看来,每次都在同一行上运行substitute命令。因此只替换了第一个$value。 (假设光标在第一行<td>行开始。)

:let new_value = ['Noodle', 'Rice', 'Pizza']
:let i = 0
qq
/$value
:s/$value/\=new_value[i]/
:let i += 1
jq  <-- Added j

如果您按照现有的方式运行宏,则如果所有文本都在一行上,则会正确执行替换。


虽然这是一个更好的解决方案

:let new_value = ['Noodle', 'Rice', 'Pizza']
:%s/$value/\=remove(new_value, 0)/g

第一行创建单词列表,第二行用列表头部替换$value的所有实例。完成此操作后,new_value将为空。 (假设new_value的大小等于$value的数量)