如何解决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
模式将匹配空格(空格或制表符)或换行符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。