Группы захвата Vim Regex [bau -> byau: ceu -> cyeu]

132

У меня есть список слов:

bau
ceu
diu
fou
gau

Я хочу превратить этот список в:

byau
cyeu
dyiu
fyou
gyau

Я безуспешно попробовал команду:

:%s/(\w)(\w\w)/\1y\2/g

Учитывая, что это не работает, что мне нужно изменить, чтобы группы захвата регулярных выражений работали в Vim?

Кристиан
источник
4
Это немного не по теме, поэтому я поместил это здесь в качестве комментария, но… я бы сделал :%norm ay<CR>.
romainl
2
В вашем случае (если это точно так, как описано), это вариант: перейти ко 2-му столбцу с помощью l, войти в режим визуального блока с помощью Ctrl+v, пометить весь столбец с Shift+gпомощью l, затем войти в режим вставки с помощью Shift+iи ввести 'y'. 7 нажатий клавиш, включая завершение Escдля выхода из режима вставки. Не публиковать как ответ, потому что это не совсем о группах захвата (это то, что я искал, когда нашел это). :-)
LAFK говорит: "Восстановите Монику"

Ответы:

224

Один из способов исправить это путь обеспечения шаблона обнесен сбежавших скобкой:

:%s/\(\w\)\(\w\w\)/\1y\2/g

Чуть меньше (и больше магии -al) заключается в использовании \v, что означает , что в образце после него все ASCII - символы , за исключением '0'-'9', 'a'-'z', 'A'-'Z'и '_'имеют особое значение:

:%s/\v(\w)(\w\w)/\1y\2/g

Видеть:

Johnsyweb
источник
41

Если вы не хотите выходить из групп захвата с помощью обратной косой черты (это то, что вы пропустили), добавьте \vв начало, чтобы превратить механизм регулярных выражений Vim в очень волшебный режим:

:%s/\v(\w)(\w\w)/\1y\2/g
Инго Каркат
источник
Инго, извините за размещение вопроса не в том месте: Это работает найти в :exmode; есть ли способ сделать это в диалоговом окне поиска / замены gvim?
JJoao
3
@JJoao: Нет, поле поиска / замены предназначено только для буквального поиска и замены. В любом случае вы не должны использовать это; это просто тренировочные колеса для пользователей Блокнота.
Инго Каркат
Инго, спасибо (это не для меня: я доволен exmode, но для лингвистов, соавторов проекта словаря): это почти работает - с \v...regexp work find; в строке замены &работает, но \ защищено ( \1\rпотеряно)
JJoao
@JJoao: Да, я тоже это узнал, играя с ним. Я по-прежнему скептически отношусь к тому, является ли использование Vim без режима Ex хорошей идеей, но вы можете легко создать свой собственный диалог поиска и замены (с внутренним питанием :s) с помощью inputdialog()Vimscript и немного его.
Инго Каркат
Инго: Еще раз спасибо; Я согласен с вашим скептическим мнением. Inputdialg +: s + vimscript, вероятно, является способом создания замены поиска в gvim. Для меня \1 \r лечение - это ошибка gvim. Я постараюсь разместить его в каком-нибудь конкретном списке vim. А пока я попробую свой единственный vimscript-inputdialog.
JJoao
34

Вы также можете использовать этот шаблон, который короче:

:%s/^./&y
  • %s применяет шаблон ко всему файлу.
  • ^. соответствует первому символу строки.
  • &yдобавляет yпосле шаблона.
Juan
источник
13

Вы также должны избежать парантезы группировки:

:%s/\(\w\)\(\w\w\)/\1y\2/g

Это трюк.

Henkersmann
источник