2013-06-05 68 views
1

我想搜索一个字符串并用第一个字符串中包含的第二个字符串替换。例如,我有以下行搜索并替换VIM上的字段

key1: foo 
    key2: bar 

我正则表达式是maches此行我所希望的方式是:

^\s\+\w:.\+ 

我想类似的东西来代替整行:

foo -> key1 
bar -> key2 

我该怎么做?

回答

6

Vim使用\1 \2等作为反向引用,所以你应该能够使用:

:%s/^\s\+\(\w\+\): \(\w\+\)/\2 -> \1/g 

击穿:

  • ^\s\+:在字符串的开头一个或多个空格。使用*如果有可能是零
  • \(\w\+\):捕获组字字符转换成\1
  • :字面结肠和空间
  • \(\w\+\):用于所述第二对
  • /\2 -> \1/置换反向引用另一捕获组。消除了空白,以及交换两组

(这里的\v非常神奇的版本,这看起来要好很多,避免吨元字符转义):

:%s/\v\s+(\w+): (\w+)/\2 -> \1/g 
+0

获得我认为'FOO - > key1'是没有结果的OP想,他可能想'foo换成与key1'但不是100%肯定。 – Kent

1

我拿出此,:s命令,

%s/\v\s*([^:]*):\zs.*/\1/ 
1

替代取代

:%norm <<dWA -> ^]pbD 

注意^]通过按<c-v><esc>

+0

我认为用':g'会更好。 – Kent

+0

@Kent。我能理解这一点。 ':g/\ v \ s + \ w +:\ s * \ w +/norm ^] pbD'是一个更大的命令。我可能会运行替代。然而,有多种解决方案是很好的。特别是当我们对有关文本知之甚少时。 –