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