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

解决方法

您可以在vim中跨行搜索和替换,请参见search across multiple lines

要完成任务,可以使用例如:

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

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...