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
这就是诀窍。