5

有谁知道是否可以将搜索结果连接到单个寄存器中?例如,我有一个包含以下内容的文件:

aaa :xxx 123
bb :y 8
ccccc :zzzzz 1923

现在我想要的是在其他地方复制以“:”开头的列。不幸的是我不能使用可视块模式,因为第一列没有固定宽度。我认为我可以搜索第二列 (:\w+) 并将机器存储到寄存器中。

4

4 回答 4

8

其他方式:

:g/:/norm f:"Aye

Per :h quote_alpha,如果您使用大写的寄存器名称,它会附加而不是替换寄存器的内容。如果你运行它并检查 register 的内容"a,你会看到

:xxx:y:zzzzz

(可能带有换行符,具体取决于您的cpoptions设置方式。)

于 2009-03-07T21:44:06.833 回答
2

你可以做一个宏:

qa(制作一个宏并将其存储在寄存器 a 中)。

“Rye(拉到词尾并将其附加到寄存器 r - 大写表示附加,小写覆盖。)

n(下一场比赛)

q(结束录音)

如果有 10 个匹配项,请执行 10@a 确保在开始时寄存器 r 为空。

于 2009-03-07T19:55:17.797 回答
1

将此添加到您的 .vimrc 或在 vim 插件文件夹中创建具有以下内容的任何文件。
通过 .vimrc 或插件执行此行后,使用 :CopyTextAfterColon 命令,然后简单地从系统缓冲区中插入所需的文本。

  function! s:copy_after_colon()
    let values = ''

    let pattern = '^.*:\(\w\+\).*$'

    for line_number in range(1, line('$'))
        let line = getline(line_number)
        if line =~ pattern
            let value = substitute(line, pattern, '\1', '')
            let values .= value."\n"
        endif
    endfor

    let @* = values
endfunction

command! -nargs=0 CopyTextAfterColon call <SID>copy_after_colon()

您可以稍后针对不同目的进行调整。

于 2009-03-07T21:12:52.227 回答
0

我将首先从解析文件开始。为此,请使用TextFieldReader而不是发明自己的 CSV 解析器:

using Microsoft.VisualBasic.FileIO;

TextFieldParser reader = new TextFieldReader("C:\MyFile.txt");
reader.Delimiters = new string[] { " " };
string[] currentRow = null;
while (!reader.EndOfData)
{
    try
    {
        currentRow = reader.ReadFields();
        foreach(string field in currentRow)
        {
            //save this field...
        }
    }
    catch (MalformedLineException ex)
    {
        //handle exception the way you want
    }
}

获得数据后,我将仅提取我感兴趣的列。如果您可以假设每一行具有相同的模式,那么您可以在解析第一行时找出正确的列,然后在解析其余行时您可以只保存相应的列。您不必将整个文件保存到内存中。

编辑:非常抱歉,我以为问题是关于 C# 编程的。我的错误 - 对不起。

于 2009-03-07T19:47:40.263 回答