[英]search and Replace in specific pattern using 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 )
我想這應該為您工作:
%s/\v([a-z])_([a-z])/\1 \2/g
"Note, this requires the `ignorecase` option not set.
要么
%s/\v(\l)_(\l)/\1 \2/g
您的問題是在命令中:
:%s/\l_\l/\l \l/g
您實際上並沒有將字母的值存儲在_
任一側,因此在搜索+替換中會丟失它們。
實際上,當替換 vim中的值時, \\l
具有特殊含義 :“使以下單詞的首字母小寫”-這顯然不是您想要的!
有幾種方法可以解決。 最簡單的方法是將兩個字母都存儲在捕獲組中,並在替換部分中使用這些值(分別為\\1
和\\2
):
:%s/\(\l\)_\(\l\)/\1 \2/g
一種更簡單的編寫方法是使用vim的魔術修飾符: \\v
消除了大多數丑陋的反斜杠的需要:
:%s/\v(\l)_(\l)/\1 \2/g
或者,另一種方法是使用vim的先行/后行功能。 例如,可以使用\\zs
和\\ze
分別標記匹配字符串的開始/結束,然后執行以下操作:
:%s/\l\zs_\ze\l/ /g
在這種情況下, _
兩側的字母不再包含在搜索中-因此不會被替換。 (因此,我們不需要將它們存儲在變量中。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.