用vim替换标记之间的所有字符实例

时间:2011-11-01 18:43:55

标签: regex vim replace

我需要用&之间的\替换/ character的所有实例。文件名> ...< / filename>标签

该文件有2.000个标记,我只需要替换这些标记内的/字符。

我该怎么办?

3 个答案:

答案 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

我测试了两者。喔。我现在解释一下。坚持下去。

  1. :g/<filename>/ - _包含<filename>
  2. 的每一行
  3. norm! - _execute普通命令(忽略映射)
  4. /filename/e 输入 跳转到开放标记的末尾
  5. vit - 以可视模式选择该标签的内部文字
  6. :s#\%V/#\\#g 输入 - 在视觉选择中,执行替换(用{{1替换\ }})

答案 2 :(得分:0)

与正则表达式一样,VIM具有明显的学习曲线。我相信这个命令会做到这一点。你必须用'\'转义每个字符。

:%s/\//\\/g