vim搜索替换问题

时间:2009-12-17 17:19:58

标签: regex 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

,遗憾的是,在某些地方包含了多余的 FUNCTION

有没有更好的方法呢?

4 个答案:

答案 0 :(得分:1)

您可以在一个命令中执行此操作:

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

如果它已经存在,它将替换“,__FUNCTION__”,如果它不存在,它将简单地附加它。

答案 1 :(得分:0)

你可以尝试:

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

在字符串后面排除带有arg的行。

第二次尝试: 使用Vim的零宽度负面后视模式:

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

那是M_TRACE后跟); ,前面没有__FUNCTION__

答案 2 :(得分:0)

我会分两步完成:首先替换引号内的部分,然后将")替换为", __FUNCTION__)

但是,如果你只想用一个命令来做:

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

答案 3 :(得分:0)

如果你有(打),你可以使用i nteractive模式进行交互式搜索/替换:

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

然后单步执行它们。你去的时候回答你的问题。