Vi:替代 - 如何定义搜索对象

时间:2012-11-23 10:21:31

标签: vi substitution

在我的源代码中,它具有以下示例:

menu = add_menu_item ((char **)HW_KIND, 21);
.
.
if(get_idx_by_str ((char **)HW_KIND, prev->column_section, 21, 0) < get_idx_by_str ((char **)HW_KIND, curr->column_section, 21, 0))
.
.
fprintf(fp, "# %d floor\n%d@%d\n\n", i, get_idx_by_str ((char **)HW_KIND, section->column_section, 21, 0), stop->stop_landing);
.
.
add_text_to_gtk_text_buffer (text_buffer, iter, NULL, -99, -99, "??????????Ե -- %s\n", HW_KIND[steel_col_data.sec_idx]);

我想找到所有句子都具有正确键HW_KIND然后21,然后将21更改为20。例如,上面的前三个句子与搜索条件匹配,但上面的最后一个句子不匹配。

如果在Linux的终端中,grep "\<HW_KIND\>" foo.c | grep 21将查找所有出现的内容。如何在 Vi 编辑器中定义替换命令?

谢谢。

2 个答案:

答案 0 :(得分:0)

你必须同时搜索HW_KIND和21,同时保留它们之间的所有内容。为此,您可以在搜索文本中使用大括号\(\)定义一个组,然后将该组替换为\1

:%s/\(HW_KIND.*\)21/\120/

也可以使用sed在命令行上进行此类替换。

答案 1 :(得分:0)

您可以使用以下正则表达式:

:%s/\(.\{-}HW_KIND.\{-}\)21\(.\{-}\)/\120\2/gc

使用c选项,您可以确认每次更换。 试试上面的正则表达式并观察它取代你想要的文本。 它将取代4场比赛。

\(\)用于捕获群组,\{-}用于非贪婪匹配。