Vim Regex Capture Groups

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

bau
ceu
diu
fou
gau

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

byau
cyeu
dyiu
fyou
gyau

Я попробовал команду:

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

Что мне нужно изменить, чтобы заставить группы захвата работать в Vim?

Ответ 1

Один из способов исправить это - обеспечить, чтобы шаблон был заключен в скобки:

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

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

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

См:

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Это трюк.