2009-05-07 3 views
1

Как заменить первые десять символов строки, где эти десять символов соответствуют определенному шаблону с первыми десятью символами из строки выше?Заменить текст из строки выше в Vim

Редактировать: Неясно, если я попрошу заменить первые десять символов, где совпадение может появиться в любом месте строки, поэтому, возможно, сделайте заметку в своем ответе, если она имеет дело с этим случаем (назовем этот случай B ? и предполагаемый один случай а)

ответ

4

Prehaps:

:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/ 

Где ABCDEFGHIJ 'является строка 10 символов на 2-й линии

+1

Что делать, если шаблон, который вы хотите совместить, это не первые 10 символов этой строки? В этом случае это может не сработать. –

+0

@B Johnson вопрос заключается в том, что 10 символов находятся в начале строки. – besen

+0

Ницца. Я не знал, что vim regexes может охватывать линии. – rampion

1

Вы можете использовать поиск и замену:

:7,9 s/foo/bar/c 

Этот пример выполняет поиск из строки 7 по 9 для каждого вхождения «Foo», и заменяет его «бар», запрашивая подтверждение при каждом ударе. Если вы не хотите подтверждать, оставьте c в конце. Выберите диапазон, как вы считаете нужным, и это должно получить, где вы хотите

+0

Это именно то, что я искал! Благодаря! –

2

Если у меня есть комплекс как обычно, я записываю макрос, используя команду q. Что-то вроде (непроверенные):

/<pattern> 
qq 
10x 
k 
10yl 
j 
P 
n 
q 

А потом repeatedy вопрос, который, как макрос @q необязательно приставкой со счетчиком.

1

Используя движения только Vim, и дергает/приклеивание .. Учитывая файловым содержание ..

1234567890abcdef 
qwertyuiopasdfgh 

С курсором на д, 10x, файл становится:

1234567890abcdef 
asdfgh 

Переместить курсор первая линия (с использованием k сделает это), затем сделайте 10yl (yank 10 символов, справа)

Затем переместите назад по одной линии, j, и вставьте P (верхний регистр, чтобы вставить под курсором) и файл становится:

1234567890abcdef 
1234567890asdfgh 

Короче говоря, начиная с курсором на д:

10xk10yljP 

..which можно вставить в или назначить to a macro

было бы короче, если бы было очевидно, что ярлык для вставки путем перезаписи, но я не мог найти такую ​​вещь

Еще один вариант невероятно неясными ищет регулярное выражение поиска/замены ..

Визуальная строки выберите две целевые строки и выполнить следующую команду поиска и замены:

:'<,'>s/\(\(.\{10\}\).*\)\n\(.\{10\}\)\(.*\)$/\1\r\2\4/ 

В основном это хватает ..

  • \1 - вся первая линия
  • \2 - первые 10 символов (в вложенной группе)
  • разрыв строки
  • \3 - первые десять символов строки два
  • \4 - остальная часть второй линии

Затем он строит две линии как \1\n\2\4 - полная первая линия, LINEBREAK, первые 10 символов первого, второго остатка от

3

Нечто подобное будет работать:

%s/^.\{10\}/\=strpart(get(getbufline("", line(".")-1), 0, ""), 0, 10)/ 

где ^.\{10\} это ваш фактический образец.

%s/      # substitute all lines matching… 
^.\{10\}     # your pattern 
/      # …with… 
\=      # an expression: 
strpart(    # gets the part of a string 
    get(     # gets an element of a list 
    getbufline(   # gets a list of lines from the current buffer 
     "", line(".")-1) # getbufline() the line before the current line 
    , 0, "")    # get() first line in buffer, default to "" 
, 0, 10)     # strpart() first ten characters 
/      # …end of substitution 
3
:2,$g/<pattern>/s/^.\{10}/\=strpart(getline(line(".")-1),0,10) 
  • 2,$ наш диапазон (как первая линия не имеет предыдущей строки)
  • g// позволяет запускать команды на линиях, которые соответствуют заданному шаблону.
  • s/^.\{10}/ заменит первые 10 символов строки
  • \= позволяет заменить результат ВИМ выражения в :s//
  • line(".") является номер текущей строки
  • getline(line(".")-1) текст предыдущей строки
  • strpart(getline(line(".")-1),0,10) это первые 10 символов предыдущей строки

Напримеризменится:

 
I like eating mangos 
before frying frogs legs 
I wish I had a puppy 
She gave Dad a frog 

к этому:

 
I like eating mangos 
I like eating frogs legs 
I wish I had a puppy 
I wish I had a frog 
Смежные вопросы