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

如何在vim中执行以下搜索和更换?,vim,Vim,我在代码中的多个位置有以下字符串 m_cells->a[ Id ] 我想用 c(Id) 其中字符串Id也可以是包括数字在内的任何内容。下面这样的正则表达式替换应该可以: %s/m_cells->a\[\s\(\w\+\)\s\]/c(\1)/g 如果您希望对多个文件应用替换操作,您可以使用该命令。对@BasBossink的答案的完整解释(作为单独的答案,因为这不适合在注释中),因为正则表达式很棒,但不平凡,绝对值得学习: 在命令模式下(即,在正常模式下键入:),s/search

我在代码中的多个位置有以下字符串

m_cells->a[ Id ]
我想用

c(Id)

其中字符串
Id
也可以是包括数字在内的任何内容。

下面这样的正则表达式替换应该可以:

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

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

对@BasBossink的答案的完整解释(作为单独的答案,因为这不适合在注释中),因为正则表达式很棒,但不平凡,绝对值得学习:
在命令模式下(即,在正常模式下键入
),
s/search\u term/replacement/
将用当前行上出现的第一个“search\u term”替换为“replacement”。
s
前面的
%
告诉vim对文档中的所有行执行操作。任何范围规范在此均有效,例如第5-10行的
5,10

最后一次
/
之后的
g
执行“全局”操作-行上所有出现的“搜索词”,而不仅仅是第一次出现。
搜索词的“m_cells->a”部分是文字匹配。然后它变得有趣。
许多字符在正则表达式中有特殊含义,如果您想按字面意思使用该字符,而没有特殊含义,则必须通过在前面放置
\
来“转义”它。
因此,
\[
\]
匹配文字'['和']'字符。
然后我们有相反的情况:我们希望将文字字符视为特殊的正则表达式实体。
\s
匹配白色*s*节奏(空格、制表符等)。
\w
匹配“*w*ord”字符(字母、数字和下划线

匹配任何字符(换行除外)。
\d
匹配数字。还有更多…
如果一个字符后面没有一个量词,那么正好有一个这样的字符匹配。因此,
\s
将匹配一个空格或制表符,而不是更少或更多。
\+
是一个量词,表示“一个或多个”。(
\?
匹配0或1;
*
(无反斜杠)匹配任意数字:零或更多。警告:匹配零次出现需要一点时间来适应;当您第一次学习正则表达式时,您并不总能获得预期的结果。也可以匹配任意精确的出现次数或范围,但我在这里不做详细介绍。)
\(
\)
共同组成一个“捕获组”。这意味着我们不只是想匹配这些字符,我们还想特别记住它们,以便我们以后可以对它们做些什么。您可以有任意数量的捕获组,它们也可以嵌套。以后可以从1(而不是0)开始按编号引用它们。只需从左边开始计算(转义)左偏执狂数量即可。
因此,我们在这里匹配一个空格,后跟一组(我们将捕获)字符,其中至少有一个“单词”字符,后跟一个空格,放在方括号内。
第二个和第三个
/
之间的部分是替换文本。
“c”是字面意思。
\1
表示第一个捕获的组,在本例中,该组将是“Id”。
总之,我们正在查找与给定描述匹配的文本,捕获其中的一部分,并用我们构建的替换文本替换整个匹配项。
也许最后一个建议是:
c
在最后一个
/
之后(不管它是在“g”之前还是之后)启用*c*确认:vim将突出显示要替换的字符,并显示替换文本,并询问您是否要继续。非常适合学习。
是的,正则表达式很复杂,但功能强大,值得学习。一旦你将它们内化,它们实际上相当容易。我建议,就像学习vim本身一样,你从基础开始,熟练掌握它们,然后逐步向你的曲目中添加新功能。

祝你好运,玩得开心。

你能回答这个问题吗