2009-12-17 94 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。