我有一些像这样的日志文件:
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.
答案 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
它的工作原理如下:
对宏观的简短解释:
* : 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\+
然后猛拉(使用yiw
,y$
,...),并将其放入搜索寄存器:
: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