如何在vim中执行以下搜索和替换?

时间:2013-09-08 17:44:55

标签: vim

我在多个地方的代码中都有以下字符串,

m_cells->a[ Id ]

我想用

替换它
c(Id)

其中字符串Id可以包括任何数字。

2 个答案:

答案 0 :(得分:9)

正则表达式替换如下所示:

%s/m_cells->a\[\s\(\w\+\)\s\]/c(\1)/g

如果您希望对多个文件应用替换操作,可以使用:bufdo命令。

答案 1 :(得分:3)

@BasBossink答案的完整解释(作为一个单独的答案,因为这不适合评论),因为正则表达式很棒而且非常重要,绝对值得学习:
在命令模式下(即从正常模式下键入:),s/search_term/replacement/将在当前行<替换'替换第一次出现的'search_term'和'replacement' / em>的。
%之前的s告诉vim对文档中的所有行执行操作。任何范围规范在此都有效,例如。第5-10行5,10 最后一个g之后的/执行“全局”操作 - 一行或多行都出现'search_term',而不仅仅是第一次出现。
搜索词的“m_cells-&gt; a”部分是文字匹配。然后它变得有趣 许多角色在正则表达式中具有特殊含义,如果你想在字面上使用角色而没有特殊含义,那么你必须通过在前面加\来“逃避”它。 因此,\[\]匹配文字'['和']'字符 然后我们有相反的情况:我们想要视为特殊正则表达式实体的文字字符 \s匹配white * s * pace(空格,制表符等) \w匹配“* w * ord”字符(字母,数字和下划线_)。
.匹配任何字符(换行符除外)。\d匹配数字。还有更多...)
如果一个字符后面没有量词,那么正好一个这样的字符匹配。因此,\s将匹配一个空格或制表符,但不会更少或更多 \+是量词,表示“一个或多个”。 (\?匹配0或1; * no 反斜杠)匹配任何数字:零或更多。警告:零次匹配时需要稍微习惯;当你是第一次学习正则表达式,你并不总是得到你期望的结果。也可以匹配任意确切的数字或出现范围,但我不会在这里进入。)
\(\)共同组成“捕获组”。这意味着我们不仅仅想要匹配这些字符,我们还想特别记住它们,以便我们以后可以对它们做些什么。您可以拥有任意数量的捕获组,也可以嵌套它们。您可以稍后通过编号引用它们,从 1 (非0)开始。只需从左侧开始计算(转义)左侧的parantheses以确定数字 所以在这里,我们匹配一个空格,后跟一个组(我们将捕获)至少一个“单词”字符,后跟一个空格,在方括号内。
然后第二个和第三个/之间的部分是替换文本 “c”是字面意思 \1表示第一个被捕获的组,在这种情况下将是“Id” 总之,我们找到与给定描述匹配的文本,捕获其中的一部分,并用我们构造的替换文本替换整个匹配。
也许是最后的建议:c在最终/之后(无论是在'g'之前还是之后)启用* c * onfirmation:vim将突出显示要替换的字符并将显示替换文本并询问您是否要继续。非常适合学习。
是的,正则表达式是复杂的,但超级强大,非常值得学习。一旦你将它们内化,它们实际上相当容易。我建议,就像学习vim本身一样,你从基础开始,熟练掌握它们,然后逐渐为你的曲目添加新功能。
祝你好运,玩得开心。