vim:替换包含特殊字符和跨多行的模式
我想更换多个物品: 我的原始文件有:vim:替换包含特殊字符和跨多行的模式,vim,replace,special-characters,Vim,Replace,Special Characters,我想更换多个物品: 我的原始文件有: <regSetting> <registerAddr>0x0112</registerAddr> <registerData>0x0A</registerData> </regSetting> <regSetting> <registerAddr>0x0113</registerAddr> <registerData>0x0
<regSetting>
<registerAddr>0x0112</registerAddr>
<registerData>0x0A</registerData>
</regSetting>
<regSetting>
<registerAddr>0x0113</registerAddr>
<registerData>0x0A</registerData>
</regSetting>
第二块:
</registerAddr>
<registerData>
第三块:
</registerData>
</regSetting>
要最终获得:
reg_write(0x0112, 0x0A);
reg_write(0x0113, 0x0A);
如果我们使用记事本++,这很容易被重放。因为我们有非正则表达式选项,搜索也可以包括新行,它可以找到所有精确匹配并替换
我在Vim中尝试过,但Vim替换选项逐行工作。我找不到合适的答案
这是一个这样的要求,同样地,我有多个替换要做。
如果在Vim中可能的话,我想拉起块,并在下面的命令中使用它(替换)
您可以在vim中跨多行搜索和替换,请参阅 要完成任务,您可以使用以下示例:
%s/^\s*<regSetting>\_s*<registerAddr>\(.*\)<\/registerAddr>\_s*<registerData>\(.*\)<\/registerData>\_s*<\/regSetting>/reg_write(\1, \2);/g
%s/^\s*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/G
它很长,但我认为很容易阅读。它基本上匹配整个
标记和内容并捕获值,然后使用捕获的值替换匹配
\\u s
模式将匹配空格(空格或制表符)或换行符。我知道\s*
但不知道\\u s*
和\s*
您能提供一些参考来搜索这些正则表达式选项吗?感谢这适合我的用例。如果你能给出关于如何进行多行视觉选择的提示,那么拉拽然后搜索/替换它会很有帮助。@ranjithkonaje我在回答中提供的链接很好地解释了\\u x
模式,否则当然会有:help\\u s
,但我觉得它太简洁了。“视觉选择多行,拖动然后搜索/替换”我不确定我是否正确理解了您的请求,您可以使用ctrl+r 0
将拖动的行粘贴到搜索“栏”。
</registerData>
</regSetting>
);
reg_write(0x0112, 0x0A);
reg_write(0x0113, 0x0A);
%s/ctrl+"/new_word/g
%s/^\s*<regSetting>\_s*<registerAddr>\(.*\)<\/registerAddr>\_s*<registerData>\(.*\)<\/registerData>\_s*<\/regSetting>/reg_write(\1, \2);/g