Скопируйте соответствующий текст для регистрации - PullRequest
5 голосов
/ 07 марта 2009

Кто-нибудь знает, возможно ли объединить совпадения, полученные в результате поиска, в один регистр? Например, у меня есть файл со следующим содержимым:

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

Теперь я хочу скопировать столбец, начинающийся с ':', в другое место. К сожалению, я не могу использовать режим визуального блока, потому что первый столбец не имеет фиксированной ширины. Я думал, что смогу найти второй столбец (: \ w +) и сохранить соответствия в регистр.

Ответы [ 4 ]

8 голосов
/ 08 марта 2009

Другой способ:

:g/:/norm f:"Aye

За :h quote_alpha, если вы используете имя регистра в верхнем регистре, оно добавляется, а не заменяет содержимое регистра. Если вы запустите это и проверите содержимое регистра "a, вы увидите

:xxx:y:zzzzz

(Возможно, с переносами строк, в зависимости от того, как вы установили cpoptions.)

2 голосов
/ 07 марта 2009

Вы можете сделать макрос:

qa (сделать макрос и сохранить его в регистре a).

"Rye (перевод слова в конец слова и добавление его к регистру r - заглавная означает добавление, перезапись строчными буквами.)

n (следующий матч)

q (конец записи)

Если есть 10 совпадений, сделайте 10 @ a Убедитесь, что регистр r пуст, когда вы начинаете.

1 голос
/ 08 марта 2009

Добавьте это в ваш .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()

Вы можете приспособить это позже для различных целей.

0 голосов
/ 07 марта 2009

Я бы сначала начал с разбора файла. Для этого используйте 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 #. Моя ошибка - извините.

...