我想搜索一个字符串并用第一个字符串中包含的第二个字符串替换。例如,我有以下行搜索并替换VIM上的字段
key1: foo
key2: bar
我正则表达式是maches此行我所希望的方式是:
^\s\+\w:.\+
我想类似的东西来代替整行:
foo -> key1
bar -> key2
我该怎么做?
我想搜索一个字符串并用第一个字符串中包含的第二个字符串替换。例如,我有以下行搜索并替换VIM上的字段
key1: foo
key2: bar
我正则表达式是maches此行我所希望的方式是:
^\s\+\w:.\+
我想类似的东西来代替整行:
foo -> key1
bar -> key2
我该怎么做?
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
我拿出此,:s
命令,
%s/\v\s*([^:]*):\zs.*/\1/
替代取代
:%norm <<dWA -> ^]pbD
注意^]
通过按<c-v><esc>
我认为用':g'会更好。 – Kent
@Kent。我能理解这一点。 ':g/\ v \ s + \ w +:\ s * \ w +/norm ^] pbD'是一个更大的命令。我可能会运行替代。然而,有多种解决方案是很好的。特别是当我们对有关文本知之甚少时。 –
获得我认为'FOO - > key1'是没有结果的OP想,他可能想'foo换成与key1'但不是100%肯定。 – Kent