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

#regex #vim #vi #replace

#регулярное выражение #vim #vi #заменить

Вопрос:

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

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

Ответ №1:

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

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

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

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

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

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

Комментарии:

1. Я понятия не имел, что это существует! Отличный совет!

Ответ №2:

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

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

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

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

 /[.*](.*{)
  

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

 :%s//1/g
  

Комментарии:

1. Я поддерживаю это в основном потому, что это показывает мне, что такое токен для замены групп, я привык использовать $1 для термина замены, но, очевидно, его 1

Ответ №3:

Как насчет:

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

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

Ответ №4:

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

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

Комментарии:

1. Это именно моя проблема, я хочу сохранить фигурные скобки и удалить только скобки и то, что внутри них.

2. О, я не был уверен, нужен ли вам просто синтаксис для регулярного выражения в vim. Я отредактировал свой ответ другим возможным решением, хотя теперь опубликовано несколько рабочих ответов.