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

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

10 голосов
/ 28 апреля 2011

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

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

Ответы [ 4 ]

14 голосов
/ 28 апреля 2011

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

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

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

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

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

.

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

3 голосов
/ 28 апреля 2011

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

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

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

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

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

:%s//\1/g
2 голосов
/ 28 апреля 2011

Как насчет:

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

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

0 голосов
/ 28 апреля 2011

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

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

...