vim:替换包含特殊字符且模式跨多行的模式
vim: replace a pattern which includes special characters and pattern spans across multiple lines
我想替换多个东西:
我的原始文件有:
<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);
如果我们使用notepad++,这个很容易替换。因为我们有非正则表达式选项,其中搜索也可以包含新行,所以它可以找到所有完全匹配并替换。
我在 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(, );/g
它很长,但我认为容易阅读。它基本上匹配整个 <regSetting>
标签和内容并捕获值,然后使用捕获的值替换匹配项。
\_s
模式将匹配白色space(space 或制表符)或换行符。
我想替换多个东西:
我的原始文件有:
<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);
如果我们使用notepad++,这个很容易替换。因为我们有非正则表达式选项,其中搜索也可以包含新行,所以它可以找到所有完全匹配并替换。
我在 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(, );/g
它很长,但我认为容易阅读。它基本上匹配整个 <regSetting>
标签和内容并捕获值,然后使用捕获的值替换匹配项。
\_s
模式将匹配白色space(space 或制表符)或换行符。