我需要用&之间的\替换/ character的所有实例。文件名> ...< / filename>标签
该文件有2.000个标记,我只需要替换这些标记内的/字符。
我该怎么办?
答案 0 :(得分:10)
编辑:鉴于新信息,下面的替换可能会起作用:
:%s/<filename>\zs.\{-}\ze<\/filename>/\=substitute(submatch(0), '\/', '\', 'g')/
阐释:
%s
:替换整个文件/<filename>
:与\zs
:匹配文字的开头.\{-}
:任何角色,非贪婪\ze
:匹配文字的结尾<\/filename>/
:目标广告和模式的结尾\=
:将替换评估为vim表达式substitute(submatch(0), '\/', '\', 'g')/
:将所有/
替换为匹配文字中的\
。原始答案:
我假设你在这里指的是XML风格的标签。我要做的是直观地选择您想要操作的区域,然后使用\%V
正则表达式原子仅对该选择进行操作。
vit:s!\%V/!\\!g
应该做的伎俩。请注意,按下:
时,vim会自动为视觉选择添加一个范围,实际的替换命令将如下所示:
:'<,'>s!\%V/!\\!g
答案 1 :(得分:2)
我们可以假设标签在单行上,它只是:
注意输入^M
为 Cv Cm ( Cq < Windows上的kbd> Cm )
:g/<filename>/norm! /filename>/e^Mvity:let @"=substitute(@", '/', '\\', "g")^Mgvp
将Randy的提示与模式中的\%V结合起来使其更简单:
:g/<filename>/norm! /filename>/e^Mvit:s#\%V/#\\#g^M
我测试了两者。喔。我现在解释一下。坚持下去。
:g/<filename>/
- _包含<filename>
norm!
- _execute普通命令(忽略映射)/filename/e
输入 跳转到开放标记的末尾 vit
- 以可视模式选择该标签的内部文字 :s#\%V/#\\#g
输入 - 在视觉选择中,执行替换(用{{1替换\
}})答案 2 :(得分:0)
与正则表达式一样,VIM具有明显的学习曲线。我相信这个命令会做到这一点。你必须用'\'转义每个字符。
:%s/\//\\/g