2

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

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.

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

有没有办法做到这一点?

4

3 回答 3

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

让我们看看它到底做了什么。

转到第一行

gg

拉动整条线

yy

开始替换

:+1,$s/

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

<Ctrl-R>"

注意:不要键入 ",您必须实际按住 Control 并按 R,然后是双引号。

删除行尾字符:

<BS>

注意:按退格键。

什么都换。

//g

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

于 2009-11-07T03:00:04.793 回答
0

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

ESC键
qw
/[CTRL-R, CTRL-W] (你应该看到光标下的单词进入命令行)
[进入]
q

那么你刚刚创建了一个宏,它在缓冲区中搜索与这个相同的下一个单词,明白了吗?它将作为宏的一部分动态地将光标下的单词拉入命令中。上面的命令中可能有类似 CTRL-W 的东西,它可以为整行执行此操作,但我不知道它是临时的。

于 2009-11-07T02:54:52.497 回答
0

在研究了 sykora 和 Matt 的答案后,我提出了一个稍微好一点的改进,它在逐行而不是逐字的基础上工作(根据Matt 的解决方案)。

此命令将在光标定位到要删除的行后执行:

:.+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

然后一无所有。

于 2009-11-08T01:31:13.567 回答