在vim中重复替换模式次数

时间:2015-04-15 11:30:10

标签: regex vim

我想在vim中执行以下操作。

  • a,2替换为a@,a@
  • b,3替换为b@,b@,b@
  • c,6替换为c@,c@,c@,c@,c@,c@ 等等。

3 个答案:

答案 0 :(得分:7)

这是强大的:help sub-replace-expression

的另一种情况
:%s/\(\w\),\(\d\+\)/\=join(repeat([submatch(1) . '@'], submatch(2)), ',')/g

匹配字符(\w)后跟,和一个数字,将@附加到每个匹配的字符(submatch(1) . '@ ),将其转换为列表[...]),将List元素与匹配的数字(repeat())相乘,然后将join() s重新转换为, - 分隔的字符串,用作替换字符。

这是基于你的例子;你需要根据你的特殊需要调整模式。

答案 1 :(得分:2)

vim具有repeat()功能。这个命令应该做你想要的:

%s/\v([a-z]),(\d+)/\=substitute(repeat(submatch(1).'@,',submatch(2)),',$','','g')/g

请注意,此行会将foo,3abc更改为foo@,o@,o@abc。结果可能不是您正在寻找的,但通过阅读命令,您应该知道这个想法,您可以更改它以使其符合您的需求。

答案 2 :(得分:1)

你可以使用 https://github.com/msanders/snipmate.vim 像SublimeText编辑器的片段

实施例

snippet doctype XHTML 1.0 Transitional
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

如果您输入

doctype XHTML 1.0 Transitional

并按[TAB] - 你自动填写文字

你可以使用像

这样的参数
snippet proto
${1:class_name}.prototype.${2:method_name} =
function(${3:first_argument}) {
    ${4:// body...}
};

: - )