2015-08-19 4 views
2

мне нужно заменить несколько строк в PHP файл как следующее (это только пример, но он представляет собой реальную проблему):поиска VIM и заменить: строка изменения, прежде чем заменить

<?php 

$errors = array(
    'error_1', 
    'error_2', 
    'error_3', 
    'error_4', 
    'error_5', 
); 

Я хочу сделать их ассоциативный массив, никаких проблем с этим:

:%s/'\(.\+\)',/'\1' => '\1',/g 

И получите следующий результат:

<?php 

$errors = array(
    'error_1' => 'error_1', 
    'error_2' => 'error_2', 
    'error_3' => 'error_3', 
    'error_4' => 'error_4', 
    'error_5' => 'error_5', 
); 

Но проблема в том, что я хочу удалить подчеркивание из значений массива (ключи должны содержать undescores), есть ли способ заменить символы подчеркивания на белые пробелы перед заменой на \ 1?

Вот вывод, что я хочу:

<?php 

$errors = array(
    'error_1' => 'error 1', 
    'error_2' => 'error 2', 
    'error_3' => 'error 3', 
    'error_4' => 'error 4', 
    'error_5' => 'error 5', 
); 
+1

Все ли они начинаются с 'error_'? –

+0

Вы можете использовать 'submatch', как объяснил @Marth; но сначала вы должны упростить свое исходное регулярное выражение, например, '% s/\ ('. \ +' \) \ zs,/=> \ 1,/g' – mMontu

ответ

2

Вы можете использовать

%s/\v'(.+)'/\="'" . submatch(1) . "' => '" . substitute(submatch(1), "_", " ", "g") . "'" 

\= начинает «суб-заменить-выражение» (см :h sub-replace-\=), в котором вы используете submatch(1) для доступа \1 и substitute() (см :h substitute()) заменить «_» на «» в своем втором возникновения (изменения "g" - "", если вы хотите заменить первое сообщение "_" в \1).


Захватив окружающие одиночные кавычки в \1 делает ту часть заменить немного легче читать:

:%s/\v('.+')/\=submatch(1) . " => " . substitute(submatch(1), "_", " ", "g") 

Конечно, если модель достаточно проста, двухбитовая решение алхимика вероятно, быстрее/проще в использовании/запоминании.

+0

не лучше, если вы поместите' g' флаг? – HuStmpHrrr

+1

@HuStmpHrrr: Кажется, это не обязательно в вопросе OP (также реальная причина в том, что у меня был «gdefault» так долго, что я почти всегда забываю об этом, когда отвечаю на вопрос). – Marth

+1

Мне просто нужно было добавить флаг «g», а затем он работал как шарм. Фактические строки немного сложнее, чем error_, например: «error_cannot_read_file_from_provided_path». Спасибо огромное! – user2937998

2

Если все они начинаются с error_, просто использовать, что:

%s/'error_\(\d\)'/'error_\1' => 'error \1'/g 

В противном случае, если все, что вы можете работать с этим подчеркиванием, вы будете просто нужно определить шаблон для этого и захватить 2 группы:

%s/'\(\w\+\)_\(\d\)'/'\1_\2' => '\1 \2'/g