迭代正则表达式结果vimscript

时间:2012-10-22 21:12:40

标签: vim

在vimscript中,如何遍历当前文件中正则表达式的所有匹配项,然后为每个结果运行shell命令?

我认为这是一个开始但我无法弄清楚如何将整个文件提供给每个匹配。

while search(ENTIRE_FILE, ".*{{\zs.*\ze}}", 'nw') > 0
    system(do something with THIS_MATCH)
endwhile

2 个答案:

答案 0 :(得分:1)

假设我们有一个包含内容的文件:

123 a shouldmatch
456 b shouldmatch
111 c notmatch

我们喜欢匹配

123 a shouldmatch
456 b shouldmatch

使用正则表达式

.*shouldmatch

如果每行只有一个匹配项,则可以使用readfile(),然后遍历这些行,并使用matchstr()检查每一行。 [1]

function! Test001()
  let file = readfile(expand("%:p")) " read current file
  for line in file
    let match = matchstr(line, '.*shouldmatch') " regex match
    if(!empty(match))
      echo match
      " your command with match
    endif
  endfor
endfunction

您可以将此功能放在~/.vimrc中,并使用call Test001()进行调用。

[1] http://vimdoc.sourceforge.net/htmldoc/eval.html#matchstr%28%29

答案 1 :(得分:0)

您可以使用subtitute()代替。例如......

call substitute(readfile(expand('%')), '.*{{\zs.*\ze}}', 
    \ '\=system("!dosomething ".submatch(1))', 'g')