Grupos de captura Vim Regex [bau -> byau: ceu -> cyeu]

132

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?

cristão
fonte
4
É um pouco fora de tópico, então eu coloquei aqui como um comentário, mas ... eu faria :%norm ay<CR>.
Romainl 11/11/2013
2
No seu caso (se for exatamente como descrito), é uma opção para: ir para a 2ª coluna com l, entrar no modo Visual Block com Ctrl+v, marcar a coluna inteira como Shift+gseguida por l, depois entrar no modo Inserir com Shift+ie inserir 'y'. 7 teclas, incluindo acabamento Escpara 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). :-)
LAFK diz Restabelecer Monica

Respostas:

224

Uma maneira de corrigir isso é garantir que o padrão esteja entre parênteses de escape :

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

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:

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

Vejo:

Johnsyweb
fonte
41

Se você não quiser escapar dos grupos de captura com barras invertidas (é isso que você perdeu), faça um prefixo \vpara transformar o mecanismo de expressão regular do Vim no modo muito mágico :

:%s/\v(\w)(\w\w)/\1y\2/g
Ingo Karkat
fonte
Ingo, desculpe-me por colocar uma pergunta no lugar errado: Isso funciona :exmode; existe uma maneira de fazer isso no gvim encontrar / substituir a caixa de diálogo?
João
3
@JJoao: Não, a caixa de localização / substituição é apenas para pesquisa e substituição literal. Você não deveria estar usando isso, de qualquer maneira; são apenas rodinhas para usuários do bloco de notas.
Ingo Karkat
Ingo, obrigado (não é para mim: estou feliz com o exmode, mas para os linguistas colaboradores de um projeto de dicionário): quase funciona - com o \v...regexp work find; no texto de substituição, &funciona, mas \ são protegidos ( \1\rsão perdidos)
JJoao
@JJoao: Sim, foi o que eu descobri enquanto brincava com ele também. Ainda estou cético quanto ao fato de usar o Vim sem o modo Ex ser uma boa idéia, mas você pode criar facilmente seu próprio diálogo de pesquisa e substituição (alimentado internamente :s) via inputdialog()e um pouco do Vimscript.
Ingo Karkat
Ingo: Obrigado novamente; Eu concordo com a sua opinião cética. Inputdialg +: s + vimscript é provavelmente a maneira como o find replace do gvim é construído. Para mim, o \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.
6135 João
34

Você também pode usar este padrão que é mais curto:

:%s/^./&y
  • %s aplica o padrão ao arquivo inteiro.
  • ^. corresponde ao primeiro caractere da linha.
  • &yadiciona o ydepois do padrão.
Juan
fonte
13

Você também precisa escapar da parênteses do agrupamento:

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

Isso faz o truque.

Henkersmann
fonte