Поиск/замена в Vim

Я хочу удалить все вхождения квадратных скобок, которые соответствуют этому регулярному выражению: \[.*\].*{, но я хочу только удалить скобки, а не следующее: т.е. я хочу удалить скобки и что внутри них, только когда за ними следует открытая фигурная скобка.

Как мне это сделать с поиском/заменой Vim?

Ответ 1

Вы можете использовать \zs и \ze, чтобы установить начало и конец совпадения.

:%s/\zs\[.*\]\ze.*{//g должен работать.

Вы сообщаете Vim о замене того, что находится между \zs и \ze пустой строкой.

(Обратите внимание, что вам нужна опция + синтаксиса, скомпилированная в двоичном коде Vim)

Для получения дополнительной информации см. :help /\zs или :help pattern

Изменить: На самом деле \zs в этом случае не требуется, но я оставляю его в образовательных целях.:)

Ответ 2

Если вы окружите последний бит своего регулярного выражения в скобках, вы можете повторно использовать его в своей замене:

:%s/\[.*\]\(.*{\)/\1/g

\ 1 ссылается на часть регулярного выражения в скобках.

Мне нравится создавать свою строку поиска, прежде чем использовать ее в поиске и замене, чтобы убедиться, что это правильно до того, как я сменил документ:

/\[.*\]\(.*{\)

Это будет означать все события того, что вы замените.
Затем запустите команду% s без поискового запроса, чтобы заставить ее повторно использовать последний поисковый запрос

:%s//\1/g

Ответ 3

Как насчет:

:%s#\[.*\]\ze.*{##g

Обратите внимание, что элемент \ze отмечает конец совпадения, поэтому все, что следует, не заменяется.

Ответ 4

Это запустит ваше регулярное выражение в текущем файле:

:%s/\[.*\]\(.*{\)/\1/g