Групи захоплення 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і ввести «у». 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

Побачити:


41

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

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

Інго, вибачте за те, що ви поставили запитання в неправильному місці: Це працює в пошуку :exmode; чи є спосіб зробити це у діалоговому вікні пошуку / заміни gvim?
JJoao

3
@JJoao: Ні, поле пошуку / заміни призначене лише для буквального пошуку та заміни. Ви все одно не повинні користуватися цим; це просто навчальні колеса для користувачів Notepad.
Інго Каркат

Інго, спасибі (це не для мене: я задоволений exmode, але для співпрацівників мовознавців у словниковому проекті): це майже працює - з \v...пошуком роботи з regexp; у рядку заміни &працює, але \ захищено ( \1\rвтрачено)
JJoao

@JJoao: Так, це я і дізнався, граючи з ним. Я все ще скептично налаштований на те, що використання Vim без Ex-режиму є хорошою ідеєю, але ви можете легко створити власний діалог пошуку та заміни (внутрішній за :sдопомогою живлення ) через inputdialog()та трохи Vimscript.
Інго Каркат

Інго: Ще раз дякую; Я згоден з вашою скептичною думкою. Inputdialg +: s + vimscript - це, мабуть, спосіб побудови заміни пошуку gvim. Для мене \1 \r лікування - це гвім-помилка. Я спробую розмістити його в якомусь конкретному списку vim. Тим часом я спробую мій один vimscript-inputdialog.
JJoao

34

Ви також можете використовувати цей візерунок, який коротше:

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

13

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

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

Це робить трюк.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.