Eu tenho uma lista de palavras:
bau
ceu
diu
fou
gau
Quero transformar essa lista em:
byau
cyeu
dyiu
fyou
gyau
Tentei sem êxito o comando:
:%s/(\w)(\w\w)/\1y\2/g
Como isso não funciona, o que preciso alterar para que os grupos de captura de expressões regulares funcionem no Vim?
regex
vim
capturing-group
regex-group
cristão
fonte
fonte
:%norm ay<CR>
.l
, entrar no modo Visual Block comCtrl+v
, marcar a coluna inteira comoShift+g
seguida porl
, depois entrar no modo Inserir comShift+i
e inserir 'y'. 7 teclas, incluindo acabamentoEsc
para sair do modo Inserir. Não postar como resposta, porque não se trata realmente de grupos de captura (que foi o que eu procurei quando o encontrei). :-)Respostas:
Uma maneira de corrigir isso é garantir que o padrão esteja entre parênteses de escape :
Ligeiramente menor (e mais mágica -al) é usar
\v
, o que significa que no padrão depois que todos os caracteres ASCII, exceto'0'-'9'
,'a'-'z'
,'A'-'Z'
e'_'
têm um significado especial:Vejo:
:help \(
:help \v
fonte
Se você não quiser escapar dos grupos de captura com barras invertidas (é isso que você perdeu), faça um prefixo
\v
para transformar o mecanismo de expressão regular do Vim no modo muito mágico :fonte
:exmode
; existe uma maneira de fazer isso no gvim encontrar / substituir a caixa de diálogo?\v...
regexp work find; no texto de substituição,&
funciona, mas\
são protegidos (\1\r
são perdidos):s
) viainputdialog()
e um pouco do Vimscript.\1 \r
tratamento é um bug do gvim. Vou tentar publicá-lo em alguma lista específica do vim. Enquanto isso, tentarei o meu único diálogo vimscript-input.Você também pode usar este padrão que é mais curto:
%s
aplica o padrão ao arquivo inteiro.^.
corresponde ao primeiro caractere da linha.&y
adiciona oy
depois do padrão.fonte
Você também precisa escapar da parênteses do agrupamento:
Isso faz o truque.
fonte