2013-06-27 100 views
6

我想用vim的搜索和替换替换所有的“with”,反之亦然。有没有办法一步到位呢?我在想这样的事情:vim中的条件替换

:s/\("\|'\)/\1=="?':"/ 

其中当然\1=="?':" -part是什么,在vim工程提前

感谢

回答

14

这是一个案例:help sub-replace-special

:s/["']/\=submatch(0) == '"' ? "'" : '"'/g 

这个匹配的两个引号(以更简单的方式与[...]),然后使用三元运算符把每个引号走向反面。 (对于更复杂的情况,可以使用字典查找。)

+0

不错的一个!非常感谢你! – Vince

+0

在替换表达式中是否可以使用匹配的模式'\ 1','\ 2',...?我尝试过,但反斜杠是从字面上插入的。 –

+1

@EnricoMariaDeAngelis:是的,通过'submatch(1)'等;文字'1'在这里不起作用。 –

0

也许最懒/最简单的方法:!

:%s/'/__/g | %s/"/'/g | %s/__/"/g 

三个基本步骤合并成一条线:

  1. 转换'__(或东西随机)
  2. 转换"'
  3. 转换__"

然后将它们有机结合起来|符号。

我确定一些vim向导会有更好的解决方案,但是这对我有用。

+0

我想到这一点,我肯定可以做到这一点,但是VIM是威武之师,我只是好奇,如果有一个一步到位的解决方案对于这个问题;-) – Vince

+0

Vim是强大的。我相信人们会更容易。 – jahroy

3

另一种方法(更适合于脚本)是使用内置的tr()函数。要应用它的缓冲区,getline()/setline()用于:

:call setline('.', tr(getline('.'), "'\"", "\"'")) 
2

你可以这样做很容易地通过使用abolish.vim插件。

Abolish.vim有一个:Subvert命令,它为您提供了一种在自己的小DSL中搜索和替换的不同方法。

:%S/{\",'}/{',\"}/g 

这个插件已经接收到具有在Vimcasts.org 三部分截屏专门给它的特殊荣誉:onetwothree

+0

什么是'\“'的转义;这非常不直观?!(当我删除它时,我得到一个'E64'。 –

3

功率的Unix工具;)

:%!tr "'\"" "\"'"