подстановка vim множественным шаблоном с оператором ИЛИ и визуальным режимом выбранного текста - PullRequest
2 голосов
/ 10 января 2020

У меня есть:

RT_T_up2 = CubicSpline(z_alot, RT_tab_up2)
RT_T_dw2 = CubicSpline(z_alot, RT_tab_dw2)
RT_T_up3 = CubicSpline(z_alot, RT_tab_up3)
RT_T_dw3 = CubicSpline(z_alot, RT_tab_dw3)
RT_T_up4 = CubicSpline(z_alot, RT_tab_up4)
RT_T_dw4 = CubicSpline(z_alot, RT_tab_dw4)

, и я хотел бы поставить «1» перед «вверх» и «dw», т.е. чтобы получить:

RT_T_up12 = CubicSpline(z_alot, RT_tab_up12)
RT_T_dw12 = CubicSpline(z_alot, RT_tab_dw12)
RT_T_up13 = CubicSpline(z_alot, RT_tab_up13)
RT_T_dw13 = CubicSpline(z_alot, RT_tab_dw13)
RT_T_up14 = CubicSpline(z_alot, RT_tab_up14)
RT_T_dw14 = CubicSpline(z_alot, RT_tab_dw14)

Был выбран исходный текст с визуальным режимом в vim.

Я пытался сделать:

:'<,'>s:up\([2-4]\):up1\1:e |  s:dw\([2-4]\):dw1\1:e

, но он заменяет только первый up, давая:

RT_T_up12 = CubicSpline(z_alot, RT_tab_up2)
RT_T_dw2 = CubicSpline(z_alot, RT_tab_dw2)
RT_T_up13 = CubicSpline(z_alot, RT_tab_up3)
RT_T_dw3 = CubicSpline(z_alot, RT_tab_dw3)
RT_T_up14 = CubicSpline(z_alot, RT_tab_up4)
RT_T_dw4 = CubicSpline(z_alot, RT_tab_dw4)

Как можно Я вставляю «1» сразу после каждого шаблона up и dw?

С уважением

Ответы [ 3 ]

2 голосов
/ 10 января 2020

Использовать вложенную группировку с оператором чередования

Я создал группы подвыражений для up и dw и вложил их вместе с оператором чередования \|.

Как указано @wobr, используйте флаг g, чтобы выполнить замену для всех вхождений в данной строке. Вы можете прочитать о флагах замещения здесь, :help :s_flags.

Я ссылаюсь только на группы подвыражений \1 и \4 в моей строке замены:

'<,'>s/\(\(up\)\|\(dw\)\)\([2-4]\)/\11\4/ge

Флаг e просто предотвращает сообщение об ошибке при сбое шаблона поиска. Большинство людей не против сообщения об ошибке.


Как правильно ссылаться на группы подвыражений

Слева направо в вашем шаблоне, посчитайте начальную скобку, (. Счет будет ссылочным номером подвыражения:

sub-expression reference counting

Это указывается в :help pattern.


Вот до и после этой команды:

enter image description here

Впоследствии:

enter image description here

1 голос
/ 14 января 2020

Моя попытка:

:%s/\v(up|dw)/\11/g

\v .................... very magic
(up|dw) ............... up or dw
\1 .................... reinserts the regex group
1  .................... here our desired 1
1 голос
/ 10 января 2020

В вашем конкретном случае, когда все записи выровнены по одному и тому же столбцу и вы хотите применить одну и ту же модификацию ("insert 1") ко всем из них, вы также можете использовать режим визуального блока для выполнения sh этого задача.

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

  • f2: переместить курсор на символ 2 в первой строке.
  • <C-V>: Войдите в режим визуального блока.
  • 5j: расширить выделение до следующих 5 строк, охватывая все записи, которые вы хотите изменить.
  • I1<Esc>: вставьте «1» перед визуальным Блок. При нажатии клавиши Escape все остальные строки получат такую ​​же модификацию.
  • 2f2: переместить курсор на последнюю цифру «2» в первой строке.
  • .: повторить , Это снова вставит «1», в столбце, в котором вы сейчас находитесь, на том же количестве строк.
...