保存搜索结果以便在以后的操作中使用

时间:2014-07-29 14:22:24

标签: vim

我有一些像这样的日志文件:

Foo number: 5551234
Opening file 5551234
Something else with 5551234 in it
1234567 is an entirely different number.

" Foo编号"每次都不一样。它可以出现在任意数量的行中,但始终具有最初的" Foo数字:#"第一次亮相。

我想用占位符文本" FOO_NUMBER"替换此数字的所有实例,以便我可以区分日志。

我已经能够使用此正则表达式匹配数字:

/\(Foo number: \)\@<=\(\d*\)

但是我需要保存这个正则表达式的匹配,所以我可以在以后的替换中使用它。如何将匹配的文本保存到寄存器中?或者在初始匹配表达式后重新使用匹配结果?

编辑:为了澄清,上面的示例文件在完成之后应该如下所示:

Foo number: FOO_NUMBER
Opening file FOO_NUMBER
Something else with FOO_NUMBER in it
1234567 is an entirely different number.

2 个答案:

答案 0 :(得分:2)

  

我想用占位符替换此数字的所有实例   文字&#34; FOO_NUMBER&#34;

%s/^Foo number: *\zs\d*/FOO_NUMBER/

这样做:

Foo number: 5551234 -> Foo number: FOO_NUMBER

更新

现在我看到你想要做什么,你想先得到数字,然后用占位符替换缓冲区中的所有数字实例。

Ingo已经给出了一个脚本来做到这一点,你也可以用宏来做:

首先进行搜索:/^Foo Number: *\zs\d*

然后按:

*qqcwFOO_NUMBER<ESC>n@qq

最后通过以下方式重播宏:@q

它的工作原理如下:

enter image description here

对宏观的简短解释:

*       : search current word, the number
qq      : record macro in reg q
cwFOO.. : change the word with the text
<esc>   : back to the normal mode
n       : go to next word(number)
@q      : call the macro recusively
q       : stop recording

答案 1 :(得分:2)

有多种方法可以获得这个号码。如果我以交互方式进行此操作,我会搜索一个事件:

/^Foo number: *\zs\d\+

然后猛拉(使用yiwy$,...),并将其放入搜索寄存器:

:let @/ = @@

然后,因为:substitute命令默认使用上次使用的搜索(注册),您可以像这样进行替换:

:%s//FOO_NUMBER/

如果我要编写映射/命令,我会改为使用这样的数字:

let pattern = '^Foo number: *\zs\d\+'
if search(pattern) > 0
    let number = matchstr(getline('.'), pattern)
    execute '%s/' . number. '/FOO_NUMBER/'
endif