5

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

我认为这是一个开始,但我不知道如何将整个文件提供给它并获得每场比赛。

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

2 回答 2

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

于 2012-10-23T08:35:48.563 回答
0

你可以subtitute()改用。例如...

call substitute(readfile(expand('%')), '.*{{\zs.*\ze}}', 
    \ '\=system("!dosomething ".submatch(1))', 'g')
于 2012-10-22T23:25:01.330 回答