2016-08-25 4 views
2

В vim, используя регулярные выражения или шаблоны, как копировать совпадение, чтобы совпадение было поставлено непосредственно после себя, без замены совпадения?Копировать регулярное выражение (регулярное выражение) в vim

Например, я хотел бы, чтобы скопировать все перед запятой на линии, чтобы после запятой:

one, 
two, 
three, 
four, 

... стали бы тогда:

one,one 
two,two 
three,three 
four,four 

я могу соответствовать с .*,, или глобально с %s/.*,. Я даже могу выполнить нулевую совпадение с .*,\@<= или даже .*,\zs. Но я не могу понять, куда идти отсюда.

+0

Как примечание стороны, документация здесь: http://vimdoc.sourceforge.net/htmldoc/pattern.html#pattern-atoms –

ответ

4

Использование группы захвата. Чтобы использовать групповой захват, поместите часть своего регулярного выражения между скобками (они должны быть экранированы), затем они будут помещены в подгруппу 1. Все в следующей паре скобок будет помещено в подгруппу два и т. Д. Для до 9 групп. Затем вы можете ссылаться на эту группу в замещающей части вашей замены. Например:

:%s/\(.*\),/\1,\1 

Это означает, захватить все до запятой, и назвать его группа \1. Затем замените этот текст на (group1),(group1). Вы также можете сделать

:%s/\(.*\),/&\1 

так & означает "весь совпавший текст" (то же самое, что и \ 0).

Вы также можете использовать очень магия, например. \v, чтобы сделать это более читаемым. Например:

:%s/\v(.*),/&\1 

Как примечание стороны, более простой способ достижения того же влияет бы использовать :%norm, который применяется набор клавиш для каждой строки. Например, вы могли бы сделать

:%norm yt,f,p 

Рекомендуется для чтения: http://vimregex.com/

+0

' magic' является режимом регулярного выражения по умолчанию. Вы имеете в виду «очень волшебство». – jshort

+0

@jshort Хорошая точка. Я отредактирую это. – DJMcMayhem

+1

Альтернативно: ':% s/\ (. * \), \ Zs/\ 1 /' –

Смежные вопросы