输入: -
{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 )
答案 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
在这种情况下,_
两侧的字母不再包含在搜索中 - 因此不会被替换。 (因此,我们不需要将它们存储在变量中。)