是否有人知道是否可以将搜索产生的匹配连接到单个寄存器中?例如,我有一个包含以下内容的文件:
aaa :xxx 123
bb :y 8
ccccc :zzzzz 1923
现在我想要的是在其他地方复制以':'开头的列。不幸的是我无法使用可视块模式,因为第一列没有固定宽度。 我以为我可以搜索第二列(:\ w +)并将maches存储到寄存器中。
答案 0 :(得分:8)
另一种方式:
:g/:/norm f:"Aye
Per :h quote_alpha
,如果使用大写的寄存器名称,它会附加而不是替换寄存器的内容。如果你运行它并检查注册"a
的内容,你会看到
:xxx:y:zzzzz
(可能使用换行符,具体取决于cpoptions
设置的方式。)
答案 1 :(得分:2)
你可以制作一个宏:
qa(制作一个宏并将其存储在寄存器a中)。
“Rye(猛拉到单词结尾并将其附加到注册r - capital表示附加,小写覆盖。)
n(下一场比赛)
q(结束录音)
如果有10场比赛,请做10 @ a 开始时确保寄存器r为空。
答案 2 :(得分: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()
您可以稍后将其用于不同目的。
答案 3 :(得分: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#编程的。我的错 - 抱歉。