VIM替换:使用当前行作为搜索字符串

时间:2009-11-07 02:39:01

标签: vim substitution

假设以下文本文件,实际上是资金和价格统计数据转储:

PBCPDF
05/01/2006
 0.0000
 0.0000
PBCPDF
 0.0000
06/01/2006
 0.0000
 0.0000
PBCPDF
 0.0082
[… lines repeat …]

我想要实现的是删除PBCPDF的所有实例,除了第一个实例,我可以将替换命令写为:.+1,$s/PBCPDF\n//g

但是,由于我想编写一个宏来处理多个基金名称,我需要一种方法来使用某种模式来检索当前行作为搜索模式,而不需要我手工完成。

有办法吗?

3 个答案:

答案 0 :(得分:4)

ggyy:+1,$s/<Ctrl-R>"<BS>//g

让我们看看它到底是做什么的。

转到第一行

gg

吸了整个衣服

yy

开始替换

:+1,$s/

从您将其拉到的寄存器中获取当前行:

<Ctrl-R>"

注意:请勿键入“,您必须实际按住Control并按R,然后输入双引号。

删除行尾字符:

<BS>

注意:按退格键。

替换为零。

//g

您可以使用qq / q或其他任何方式将其记录在宏中。

答案 1 :(得分:0)

如果你在宏中执行此操作(使用q命令),当你执行一些更深奥的击键命令时,它足够聪明 - 我特别想到的是CTRL-R,CTRL-W ,它会将光标下的单词插入命令行。所以,例如,如果你做了

ESC
qw
/[CTRL-R, CTRL-W] (you should see the word under the cursor enter the command line)
[enter]
q

然后你刚刚创建了一个宏来搜索缓冲区中与下一个相同的下一个单词,得到它吗?它将动态地将光标下的单词作为宏的一部分放入命令中。在上面的命令中可能有像CTRL-W这样的东西,但是我不知道这一点。

答案 2 :(得分:0)

在研究了sykora和Matt的答案之后,我想出了一个稍微好一点的改进,它在逐行的基础上而不是在逐字的基础上工作(按照Matt's solution)。

在光标位于要进行删除的行上之后执行此命令:

:.+1,$s/<CTRL-R>=getline(".")<CR>\n//g

VIM初学者的说明:

:.+1,$s/

从当前行(.+1)和文件结束($

之后的行开始替换
<CTRL-R>=getline(".")<CR>\n

<CTRL-R>指实际按下CTRL和R键,允许您输入特殊表达式。在这种情况下,=getline(".")检索当前行的文本。

<CR>表示按下回车键,完成<CTRL-R>表达式。我还在搜索模式的末尾指定换行符(\n),因为我需要删除它。

//g

然后一无所获。