有谁知道是否可以将搜索结果连接到单个寄存器中?例如,我有一个包含以下内容的文件:
aaa :xxx 123
bb :y 8
ccccc :zzzzz 1923
现在我想要的是在其他地方复制以“:”开头的列。不幸的是我不能使用可视块模式,因为第一列没有固定宽度。我认为我可以搜索第二列 (:\w+) 并将机器存储到寄存器中。
其他方式:
:g/:/norm f:"Aye
Per :h quote_alpha,如果您使用大写的寄存器名称,它会附加而不是替换寄存器的内容。如果你运行它并检查 register 的内容"a,你会看到
:xxx:y:zzzzz
(可能带有换行符,具体取决于您的cpoptions设置方式。)
你可以做一个宏:
qa(制作一个宏并将其存储在寄存器 a 中)。
“Rye(拉到词尾并将其附加到寄存器 r - 大写表示附加,小写覆盖。)
n(下一场比赛)
q(结束录音)
如果有 10 个匹配项,请执行 10@a 确保在开始时寄存器 r 为空。
将此添加到您的 .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()
您可以稍后针对不同目的进行调整。
我将首先从解析文件开始。为此,请使用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# 编程的。我的错误 - 对不起。