Я хочу сделать это:
%s/shop_(*)/shop_\1 wp_\1/
Почему не делает shop_(*)
соответствовать чему-нибудь?
Если я правильно понял, вы хотите %s/shop_\(.*\)/shop_\1 wp_\1/
Исключите захватывающую скобку и используйте .*
для поиска любого количества любых символов.
(Ваш поиск ищет "shop_", за которым следует любое количество открывающих круглых скобок, за которыми следует закрывающая скобка)
Здесь есть несколько проблем.
Парены в vim regexen не предназначены для захвата - для захвата нужно использовать \( \)
.
*
означает не то, что вы думаете. Он означает "0 или более предыдущих", поэтому ваш regex означает "строка, содержащая shop_
, за которой следует 0+ (
и затем литерал )
.
Вы ищете
, что в regex означает "любой символ". В сочетании со звездой, как .*
, это означает "0 или более любых символов". Вам, вероятно, нужен хотя бы один символ, поэтому используйте .\+
(+
означает "1 или более предыдущего")
Используйте это: %s/shop_\(.\+\)/shop_\1 wp_\1/
.
По желанию завершите его g
после последней косой черты, чтобы заменить все экземпляры в одной строке, а не только первый.