0

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

m_cells->a[ Id ]

我想用

c(Id)

字符串Id可以是任何东西,包括数字。

4

2 回答 2

9

像下面这样的正则表达式替换应该做:

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

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

于 2013-09-08T17:50:17.090 回答
3

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

于 2013-09-08T18:45:34.400 回答