Vim regex обратная ссылка

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

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

Почему не делает shop_(*) соответствовать чему-нибудь?

60
задан nnyby 26 July 2010 в 21:18
поделиться

2 ответа

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

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

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

20
ответ дан 24 November 2019 в 17:50
поделиться

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

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

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

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

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

71
ответ дан 24 November 2019 в 17:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: