簡體   English   中英

使用VIM搜索並替換為特定模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM