使用VIM搜索和替换特定模式

时间:2016-06-14 14:13:42

标签: 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 )

2 个答案:

答案 0 :(得分: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 :(得分:1)

你的问题是在命令中:

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

你实际上并没有在_的任何一侧存储字母的值,所以你在搜索+替换中丢失它们。

事实上,当在vim中替换值时,\l has a special meaning:“将下一个单词的第一个字母设为小写” - 这显然不是你的意思意!

有几种方法可以解决。最简单的方法是将两个字母存储在捕获组中,并在替换部分(分别为\1\2)中使用这些值:

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

稍微简单一点的方法就是使用vim的very magic修饰符:\v - 这样就不需要大多数丑陋的反斜杠了:

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

或者,另一种方法是使用vim的lookbehind / lookahead功能。例如,您可以使用\zs\ze分别标记匹配字符串的开头/结尾,并执行以下操作:

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

在这种情况下,_两侧的字母不再包含在搜索中 - 因此不会被替换。 (因此,我们不需要将它们存储在变量中。)