vim - 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 中跨多行搜索和替换,请参阅多行搜索。
为了完成您的任务,您可以使用例如:
%s/^\s*<regSetting>\_s*<registerAddr>\(.*\)<\/registerAddr>\_s*<registerData>\(.*\)<\/registerData>\_s*<\/regSetting>/reg_write(\1, \2);/g
它很长,但我认为易于阅读。它基本上匹配整个<regSetting>
标签和内容并捕获值,然后使用捕获的值替换匹配项。
该\_s
模式将匹配空格(空格或制表符)或换行符。
推荐阅读
- flutter - 将flutter_sodium与最新的flutter框架一起使用
- c - 我如何解密 A AES 128 CBC 消息的消息
- swift - 返回 AnyObject 时出现 Swift“无法实例化协议类型‘AnyObject’”错误
- sql - 使用 json 值查询 SQL 列
- java - 如何将嵌套 HashMap 转换为 Jettison JSONObject
- python - 查询大数据时超集仪表板表类型并且速度很慢?
- error-handling - 如何将错误策略应用于使用 apollo-client 的订阅挂钩?
- javascript - How to make text of
not move
- amazon-web-services - 用于 aws 代码管道中的无服务器框架的 Buildspec.yaml
- reactjs - 我可以构建一个 API 让我与 iframe 中的内容进行交互吗?