2011-11-01 133 views
7

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

该文件具有2.000这些标签,我只需要替换这些标签中的/字符。

我该怎么办?

+0

@ewok是什么使这从另一个数百编辑器不同相关的问题? – deviousdodo

+0

@ewok:vim问题(像这样的特殊正则表达式问题)正好在常见于“程序员通常使用的软件工具”类别中,在faq – jkerian

回答

9

编辑:在新的信息,下面的替代可能会工作:

:%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 
+0

中明确列为“on topic”类别,这已经相当成熟了,谢谢,但这只适用于选择了实际的标签,而不是所有的标签,都这样做? – Oletros

+0

正确。这是你可能想要在你的问题中更明显一些的细节。 –

+0

谢谢,它已经像一个魅力:) – Oletros

0

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

:%s/\//\\/g 
+0

谢谢,但这将取代更多/我需要更换,我只需要更换/内< filename > ... – Oletros

+0

哦,我的坏,你只是想要切换标签中的路径。我不知道我头顶的正则表达式;尝试看看本教程:http://www.thatsquality.com/articles/how-to-match-and-replace-content-between-two-html-tags-using-regular-expressions – Noah

+0

谢谢,我会看看它 – Oletros

2

当且仅当我们可以假设标签是单线条,它很简单:

注意输入^M作为在Windows上了Cv厘米CQ厘米

:g/<filename>/norm! /filename>/e^Mvity:let @"=substitute(@", '/', '\\', "g")^Mgvp 

嗯上以一定图案用\%V整合由兰迪暗示使得它更简单:

:g/<filename>/norm! /filename>/e^Mvit:s#\%V/#\\#g^M 

我测试两者。喔。我现在解释一下。等一下。

  1. :g/<filename>/ - _for含有<filename>
  2. norm!每一行 - _execute正常命令(忽略映射)
  3. /filename/e输入跳转到开放标记的末尾
  4. vit - 选择th的内部文本在可视模式标签
  5. :s#\%V/#\\#g输入 - _ON是视觉选择,执行替换(更换\/
相关问题