2009-12-17 103 views
0

我有幾個軌跡線在我的表格的文件VIM搜索替換的問題

M_TRACE(EV_TRACE_LEVEL_DEBUG, "some trace"); 

我希望將這些轉化爲

M_TRACE(EV_TRACE_LEVEL_DEBUG, "%s: some trace", __FUNCTION__); 

但是我有一個顯示已經幾痕跡函數名稱也。

爲了讓我用下面的命令

:%g/M_TRACE/s/"\(.*\)"/"%s: \1", __FUNCTION__/c 

不幸包括冗餘功能在一些地方的轉換。

有沒有更好的方法來做到這一點?

+0

你好arun kumar,歡迎來到堆棧溢出!如果您找到適合您的解決方案,請將答案標記爲已接受。這個社區在我們全部參與時都會增長。不接受答案接受將損害你的聲譽,並阻止未來渴望的志願者。 :) – zen 2009-12-23 06:30:04

回答

1

您可以在一個命令這樣做:

:%g/M_TRACE/s/"\(.*\)"\(, __FUNCTION__\)\?/"%s: \1", __FUNCTION__/ 

它將取代「__FUNCTION__」如果它已經存在,或者如果它不存在,它只是添加它。

0

你可以嘗試:

:%g/M_TRACE.*\");/s/"\(.*\)"/"%s: \1", __FUNCTION__/c 

排除線與後弦的ARG。

第二次嘗試: 使用Vim的零寬度負向後看模式:

%g/M_TRACE.*\(__FUNCTION__\)\@<!);/s/"\(.*\)"/"%s: \1", __FUNCTION__/ 

這是M_TRACE後跟一個);那不是由__FUNCTION__

+0

不幸的是我有很多帶參數的宏。對不起之前沒有提到過。 – 2009-12-17 17:55:58

0

我會做的兩個步驟之前:先用", __FUNCTION__)

更換部件的引號內,然後更換")不過,如果你只是想只是一個命令來做到這一點:

:%g/M_TRACE/s/"\(.*\)".*/"%s: \1", __FUNCTION__); 
+0

我的替代將做到兩者。只是我不能僅選擇那些沒有__FUNCITON__的行。而不是像你所建議的那樣分兩步進行,我使用了確認標誌(/ c)。 我想知道是否有更好的方法來做到這一點 – 2009-12-17 17:55:11

+0

做兩個替代無需手動確認,聽起來像是對我來說更好的方式。 – 2009-12-17 18:47:03

0

如果你有幾個(打)你可以做一個互動的查找/替換使用i nteractive模式:

:%g/M_TRACE/s/"\(.*\)"/"%s: \1", __FUNCTION__/igc 

只是通過他們。隨時回答y/n。