首页 > 解决方案 > vim:替换包含特殊字符和模式跨越多行的模式

问题描述

我想替换多个东西:

我的原始文件有:

<regSetting>
  <registerAddr>0x0112</registerAddr>
  <registerData>0x0A</registerData>
</regSetting>
<regSetting>
  <registerAddr>0x0113</registerAddr>
  <registerData>0x0A</registerData>
</regSetting>

我想更换 3 个项目:

第一个块:

<regSetting>
      <registerAddr>

要得到:

reg_write(

第二块:

</registerAddr>
<registerData>

要得到:

,

第三块:

</registerData>
</regSetting>

要得到:

);

最终得到:

reg_write(0x0112, 0x0A);
reg_write(0x0113, 0x0A);

如果我们使用记事本++,这很容易替换。因为我们有非正则表达式选项,其中搜索也可以包含新行,它可以找到所有完全匹配并替换。

我在 Vim 中尝试过,但 vim 替换选项逐行工作。我找不到合适的答案。

这是一个这样的要求,同样我有多个替换要做。如果在 Vim 中可能,我想拉出块,并在下面的命令中使用它(替代)

%s/ctrl+"/new_word/g

标签: vimreplacespecial-characters

解决方案


您可以在 vim 中跨多行搜索和替换,请参阅多行搜索

为了完成您的任务,您可以使用例如:

%s/^\s*<regSetting>\_s*<registerAddr>\(.*\)<\/registerAddr>\_s*<registerData>\(.*\)<\/registerData>\_s*<\/regSetting>/reg_write(\1, \2);/g

它很长,但我认为易于阅读。它基本上匹配整个<regSetting>标签和内容并捕获值,然后使用捕获的值替换匹配项。

\_s模式将匹配空格(空格或制表符)或换行符。


推荐阅读