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?



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:


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, 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.

13

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

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

Isso faz o truque.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.