1

我想搜索一个字符串并替换为第一个字符串中包含的第二个字符串。例如我有以下几行

    key1: foo
    key2: bar

我按照我想要的方式处理这条线的正则表达式是:

^\s\+\w:.\+

我想用类似的东西替换整行:

foo -> key1
bar -> key2

我该怎么做?

4

3 回答 3

6

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

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

分解:

  • ^\s\+: 字符串开头的一个或多个空格。*如果可能为零,请使用
  • \(\w\+\):将一组单词字符捕获到\1
  • :文字冒号和空格
  • \(\w\+\):第二对的另一个捕获组
  • /\2 -> \1/替换为反向引用。消除前导空格,并交换两组

(这是\v非常神奇的版本,它看起来会更好,并避免大量元字符转义):

:%s/\v\s+(\w+): (\w+)/\2 -> \1/g
于 2013-06-05T15:30:25.497 回答
1

替代替代品

:%norm <<dWA -> ^]pbD

请注意,这^]是通过按<c-v><esc>

于 2013-06-05T15:40:36.257 回答
1

我想出了这个,:s命令,

 %s/\v\s*([^:]*):\zs.*/\1/
于 2013-06-05T15:32:07.863 回答