我想搜索一个字符串并替换为第一个字符串中包含的第二个字符串。例如我有以下几行
key1: foo
key2: bar
我按照我想要的方式处理这条线的正则表达式是:
^\s\+\w:.\+
我想用类似的东西替换整行:
foo -> key1
bar -> key2
我该怎么做?
Vim 使用\1 \2
etc 作为反向引用,所以你应该能够使用:
:%s/^\s\+\(\w\+\): \(\w\+\)/\2 -> \1/g
分解:
^\s\+
: 字符串开头的一个或多个空格。*
如果可能为零,请使用\(\w\+\)
:将一组单词字符捕获到\1
:
文字冒号和空格\(\w\+\)
:第二对的另一个捕获组/\2 -> \1/
替换为反向引用。消除前导空格,并交换两组(这是\v
非常神奇的版本,它看起来会更好,并避免大量元字符转义):
:%s/\v\s+(\w+): (\w+)/\2 -> \1/g
替代替代品
:%norm <<dWA -> ^]pbD
请注意,这^]
是通过按<c-v><esc>
我想出了这个,:s
命令,
%s/\v\s*([^:]*):\zs.*/\1/