将x *(string)形式的表达式替换为该字符串的x个副本

时间:2011-03-22 10:29:26

标签: vim sed substitution

我有一些表格3 *(item1; item2; item3;),我想用item1替换它们; item2; item3; item1; item2; item3; item1; item2; item3; (即括号中的3个批次,不包括括号)

我可以写一个正则表达式来提取相关部分,但我不知道如何做其他部分 - 我玩了一下submatch()和eval(),但我还没找到办法将字符串连接到自身特定次数:

:%s/\(\d+\)\*(\(\_[^)]\+\))/what goes here...?

我曾希望像\ 2 {\ 1}这样的东西可以工作,但是这并没有评估大括号中的数字。如果我以错误的方式解决这个问题 - 我并不特别喜欢这样做,这就是我所知道的,我只是想知道在Vim中是否很容易实现。

谢谢,如果有人可以提供帮助!

2 个答案:

答案 0 :(得分:0)

您可以定义一个重复复制字符串的函数...

function! RepeatString(n,s)
  let l:result=""
  let l:n=a:n
  while l:n>0
    let l:result = l:result . a:s
    let l:n = l:n-1
  endwhile
  return l:result
endfunction

(注意:如果n很大,这是非常低效的;很可能是,例如,制作一个列表并调用join更有效率)然后使用{{1}的表达式评估功能} ...

:s

(注意:我的正则表达式与您的正则表达式之间存在一些差异,这可能是原始问题中拼写错误的结果)。

答案 1 :(得分:0)

无需自定义功能。您可以以相同的方式使用内置repeat()

%s#\v(\d+)\*\((\_[^)]+)\)#\=repeat(submatch(2), submatch(1))#gc

有关内置函数列表的更多信息:help repeat():help function-list