Vim поиск заменить регулярное выражение

Я пытаюсь заменить все вхождение hello(...) на hello[...]

Я пробовал такие вещи, как %s/hello\((.*?)\)/hello\[$1\]/ без каких-либо успехов

Любая помощь PLS?

Ответ 1

Этот синтаксис Perl, а не Vim. В регулярных выражениях Vim, по крайней мере по умолчанию, круглые скобки соответствуют самим себе и обратным скреплениям скобок - противоположность Perl. Кроме того, Vim не понимает неживого модификатора ?, а группы захвата интерполируются с помощью \ n, а не $ n. Попробуйте следующее:

%s/hello(\([^)]*\))/hello[\1]/

В качестве альтернативы вы можете использовать модификатор \v ( "очень волшебный" ), чтобы сделать поведение по отношению к специальным символам и обратным косым чертам более похожим на Perl, хотя оно не позволяет Vim понять *? или изменить его интерполяцию синтаксис:

%s/\vhello\(([^)]*)\)/hello[\1]/

Также обратите внимание, что вам не нужны обратные косые черты в квадратных скобках в заменяющем тексте - правая часть команды подстановки не является регулярным выражением, поэтому вам не нужно беспокоиться о большинстве символов, которые специальные в одном. В значительной степени только обратная косая черта является специальной и может использоваться для включения групп захвата или буквального экземпляра самого себя или разделителя.