Juntando todas as partidas de um grupo no VIM

3

Estou tentando escrever um comando substituto que pesquise um texto contendo pelo menos 4 letras separadas por espaços e remova os espaços:

%s/\v%(([a-zA-Z])\s){3,}([a-zA-Z])//gc

Mas

L i g ht

torna-se

ght

como esperado, porque um grupo contém apenas a última correspondência que foi g nesse caso. Como acumular todas as correspondências do grupo e depois juntá-las?

    
por ka3ak 25.05.2018 / 11:24

1 resposta

2

Dado um grupo repetido como (...){n,m} ou (...)+ , acho que não há nenhuma maneira de extrair cada ocorrência do grupo no Vim. Somente o último é disponibilizado em todas as funções e comandos relacionados ao regex.

Dito isto, você pode usar uma substituição aninhada:

:s/\v%([a-zA-Z]\s){3,}[a-zA-Z]/\=substitute(submatch(0), '\s', '', 'g')/gc

Um \= na substituição de :s faz o Vim avaliar a substituição como uma expressão. E nessa expressão, estou usando a função substitute() para remover todos os espaços em todo o texto correspondente de :s (obtido por submatch(0) ), dando Ligh de L i g h .

    
por 25.05.2018 / 11:51