Vim 保存搜索结果以供以后的操作使用

Vim 保存搜索结果以供以后的操作使用,vim,Vim,我有一些如下的日志文件: Foo number: 5551234 Opening file 5551234 Something else with 5551234 in it 1234567 is an entirely different number. :%s//FOO_NUMBER/ let pattern = '^Foo number: *\zs\d\+' if search(pattern) > 0 let number = matchstr(getline('.')

我有一些如下的日志文件:

Foo number: 5551234
Opening file 5551234
Something else with 5551234 in it
1234567 is an entirely different number.
:%s//FOO_NUMBER/
let pattern = '^Foo number: *\zs\d\+'
if search(pattern) > 0
    let number = matchstr(getline('.'), pattern)
    execute '%s/' . number. '/FOO_NUMBER/'
endif
其中“Foo编号”每次都不同。它可以出现在任意数量的行中,但始终以初始“Foo number:#”行作为其第一个外观

我想用占位符文本“FOO_number”替换此编号的所有实例,以便区分日志

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

/\(Foo number: \)\@<=\(\d*\)
我想用占位符替换此数字的所有实例 文本“FOO_编号”

这将有助于:

Foo number: 5551234 -> Foo number: FOO_NUMBER
更新 现在我知道您要做什么了,首先要获取数字,然后用占位符替换缓冲区中的所有数字实例

Ingo提供了一个脚本,您也可以使用宏:

首先搜索:
/^Foo编号:*\zs\d*

然后按:

*qqcwFOO_NUMBER<ESC>n@qq
我想用占位符替换此数字的所有实例 文本“FOO_编号”

这将有助于:

Foo number: 5551234 -> Foo number: FOO_NUMBER
更新 现在我知道您要做什么了,首先要获取数字,然后用占位符替换缓冲区中的所有数字实例

Ingo提供了一个脚本,您也可以使用宏:

首先搜索:
/^Foo编号:*\zs\d*

然后按:

*qqcwFOO_NUMBER<ESC>n@qq

有不同的方法来获取号码。如果以交互方式执行此操作,我会搜索事件:

/^Foo number: *\zs\d\+
然后猛拉(使用
yiw
y$
,…),并将其放入搜索寄存器:

:let @/ = @@
然后,由于
:substitute
命令默认为上次使用的搜索(register),因此可以按如下方式进行替换:

Foo number: 5551234
Opening file 5551234
Something else with 5551234 in it
1234567 is an entirely different number.
:%s//FOO_NUMBER/
let pattern = '^Foo number: *\zs\d\+'
if search(pattern) > 0
    let number = matchstr(getline('.'), pattern)
    execute '%s/' . number. '/FOO_NUMBER/'
endif

如果我编写一个映射/命令,我会像这样获取数字:

Foo number: 5551234
Opening file 5551234
Something else with 5551234 in it
1234567 is an entirely different number.
:%s//FOO_NUMBER/
let pattern = '^Foo number: *\zs\d\+'
if search(pattern) > 0
    let number = matchstr(getline('.'), pattern)
    execute '%s/' . number. '/FOO_NUMBER/'
endif

有不同的方法来获取号码。如果以交互方式执行此操作,我会搜索事件:

/^Foo number: *\zs\d\+
然后猛拉(使用
yiw
y$
,…),并将其放入搜索寄存器:

:let @/ = @@
然后,由于
:substitute
命令默认为上次使用的搜索(register),因此可以按如下方式进行替换:

Foo number: 5551234
Opening file 5551234
Something else with 5551234 in it
1234567 is an entirely different number.
:%s//FOO_NUMBER/
let pattern = '^Foo number: *\zs\d\+'
if search(pattern) > 0
    let number = matchstr(getline('.'), pattern)
    execute '%s/' . number. '/FOO_NUMBER/'
endif

如果我编写一个映射/命令,我会像这样获取数字:

Foo number: 5551234
Opening file 5551234
Something else with 5551234 in it
1234567 is an entirely different number.
:%s//FOO_NUMBER/
let pattern = '^Foo number: *\zs\d\+'
if search(pattern) > 0
    let number = matchstr(getline('.'), pattern)
    execute '%s/' . number. '/FOO_NUMBER/'
endif

谢谢,但这只会取代第一次出现的数字。我想用第一行来确定数字是什么,然后替换整个文件中出现的所有数字。@JohnSprad刚才我误解了您的要求,请参阅答案中的更新。谢谢,但这只替换了数字的第一次出现。我想用第一行来确定数字,然后替换整个文件中出现的所有内容。@JohnSprad刚才我误解了您的要求,请参阅更新答案。