Vim regex обратная ссылка - PullRequest
51 голосов
/ 27 июля 2010

Я хочу сделать это:

%s/shop_(*)/shop_\1 wp_\1/

Почему shop_(*) ничему не соответствует?

Ответы [ 2 ]

64 голосов
/ 27 июля 2010

Здесь есть несколько вопросов.

  1. парены в vim regexen не для захвата - вам нужно использовать \( \) для захвата.

  2. * не означает, что вы думаете. Это означает «0 или более из предыдущего», поэтому ваше регулярное выражение означает «строку, содержащую shop_, за которой следует 0+ (, а затем литерал ).
    Вы ищете . , что в регулярном выражении означает «любой символ». Соедините со звездой как .*, что означает «0 или более любого символа». Возможно, вам нужен хотя бы один символ, поэтому используйте .\+ (+ означает «1 или больше из предыдущего ")

Используйте это: %s/shop_\(.\+\)/shop_\1 wp_\1/.

При желании завершите его с g после последней косой черты, чтобы заменить все экземпляры в одной строке, а не только в первой.

10 голосов
/ 27 июля 2010

Если я правильно понимаю, вы хотите %s/shop_\(.*\)/shop_\1 wp_\1/

Избежать скобки захвата и использовать .* для соответствия любому числу любого символа.

(Ваш поиск ищет "shop_"«с последующим любым количеством открывающих скобок с последующими закрывающими скобками)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...