Vim正则expression式捕获组

我有一个单词列表:

bau ceu diu fou gau 

我想把这个列表变成:

 byau cyeu dyiu fyou gyau 

我试过这个命令:

 :%s/(\w)(\w\w)/\1y\2/g 

为了使捕获组在Vim中工作,我需要做些什么改变?

解决这个问题的一个方法是确保模式被括号括起来:

 :%s/\(\w\)\(\w\w\)/\1y\2/g 

稍微短一点(也就是更多的魔术 )就是使用\v ,意思是在除了'0'-'9''a'-'z''A'-'Z'以外'0'-'9'所有ASCII字符'_'有特殊的含义:

 :%s/\v(\w)(\w\w)/\1y\2/g 

看到:

  • :help \(
  • :help \v

如果你不想用反斜线(这是你错过的)来避开捕获组,那么在\v把Vim的正则expression式引擎变成非常神奇的模式:

 :%s/\v(\w)(\w\w)/\1y\2/g 

你也可以使用这个较短的模式:

 :%s/^./&y 
  • %s将模式应用于整个文件。
  • ^. 匹配该行的第一个字符。
  • &y在模式之后添加y

你也必须逃避分组的假设:

 :%s/\(\w\)\(\w\w\)/\1y\2/g 

这就是诀窍。