2016-06-14 3 views
1

вход: -поиск и замена в определенной схеме с использованием VIM

{NSM_QOS_DEFAULT_COS_OVERRIDE_NOT_CONFIGURED, "%% nsm_qos_default_cos_override_not_configured"}, 
{NSM_QOS_COS_SETTING_FAILED,  "%% nsm_qos_cos_setting_failed"}, 
{NSM_QOS_ACCESS_GROUP_ALREADY_ATTACHED_TO_CLASS_MAP, "%% nsm_qos_access_group_already_attached_to_class_map"}, 

Вывод должен быть: -

{NSM_QOS_DEFAULT_COS_OVERRIDE_NOT_CONFIGURED, "%% nsm qos default cos override not configured"}, 
{NSM_QOS_COS_SETTING_FAILED,  "%% nsm qos cos setting failed"}, 
{NSM_QOS_ACCESS_GROUP_ALREADY_ATTACHED_TO_CLASS_MAP, "%% nsm qos access group already attached to class map"}, 

Я попробовал шаблон поиска: -

%s/\l_\l/\l \l/g 

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

before : - nsm_qos 
after : - nm os  (but i need like this --> nsm qos) 

ответ

1

Я предполагаю, что это должно работать для вас:

%s/\v([a-z])_([a-z])/\1 \2/g 
"Note, this requires the `ignorecase` option not set. 

или

%s/\v(\l)_(\l)/\1 \2/g 
1

Ваша проблема заключается в том, что в команде:

:%s/\l_\l/\l \l/g 

вы на самом деле не хранить значение букв по обе стороны от _, поэтому вы теряете их как часть поиска + repl Туз.

В самом деле, когда замена значения в Vim, \lhas a special meaning: «Сделать первую букву следующего слова строчной» - что явно не то, что вы хотели!

Существует несколько способов решения этой проблемы. Проще всего хранить оба письма в группах захвата, и использовать эти значения в разделе замены (\1 и \2 соответственно):

:%s/\(\l\)_\(\l\)/\1 \2/g 

немного более простой способ написания этого является использование very magic модификатора VIM в: \v - который устраняет необходимость для большинства из тех уродливых обратных косых черт:

:%s/\v(\l)_(\l)/\1 \2/g 

Или, альтернативный подход заключается в использовании функции просмотра назад/опережении VIM в. Не Например, вы можете использовать \zs и \ze, чтобы отметить начало/конец совпавшей строки соответственно, и выполните следующие действия:

:%s/\l\zs_\ze\l/ /g 

В этом случае буквы на каждой стороне _ больше не включены в поиск - и, следовательно, не заменяются. (Таким образом, нам не нужно хранить их в переменной.)

Смежные вопросы