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