Selecione todo o texto correspondente no Vim?

4

Eu tenho um monte de dados, e eu quero arrancar tudo o que combina o seguinte regex para um registro:

/'user': '[a-Z]*'

Existe alguma maneira de copiar todas as correspondências para um registro no vanim vim? Eu olhei para esta questão , mas isso só funciona para um resultado, depois de pressionar 'n' para ir para o próximo resultado, ele usará '// e' novamente e irá para o final do próximo resultado, ao invés do começo.

Eu também consultei este Então, pergunta . É quase exatamente o que estou procurando, exceto que não consigo descobrir como alterá-lo para trabalhar com correspondências específicas em vez das linhas em que estão.

    
por Marcus Buffett 29.09.2014 / 17:20

4 respostas

6

Isso pode ser feito simplesmente executando um comando :s com o conjunto de sinalizadores n (que basicamente diz, para não substituir nada (mas usando um \= na peça de substituição, você ainda pode capturar o corresponde (veja :h sub-replace-special ). Então, primeiro vamos limpar o registrador A:

qaq

Depois, você pode capturar suas máquinas para registrar um usando:

:%s/'user': '[a-Z]*'/\=setreg('A', submatch(0), 'V')/gn

E cole seus jogos:

:put A

Isso precisa pelo menos do Vim 7.4 (esqueci o número real do patch).

    
por 30.09.2014 / 10:05
3

"limpar o registro 'a'

qaq

"busca global e arranca todas as linhas ('A') no registro 'a'.

:g/'user': '[a-Z]*'/y A

Modifique a parte entre :g/ and /y A conforme necessário.

"cole em outro arquivo

"aP

    
por 30.09.2014 / 20:16
0

Você pode usar o comando :YankMatches do meu plug-in ExtractMatches :

:%YankMatches /'user': '[a-Z]*'/

Cada correspondência é colocada em uma nova linha por padrão; para usar outro separador, há um formulário alternativo.

    
por 29.09.2014 / 17:39
0

Provavelmente, existe uma maneira melhor (estes são ineficientes se estamos falando de um número realmente grande de entradas - deve estar bem, desde que não estamos falando de milhares e milhares), mas a primeira coisa que vem a mente é uma macro recursiva. Primeiro, desligue a opção wrapscan para que as pesquisas que chegarem ao final do arquivo não passem pelo início novamente (caso contrário, você terá um loop infinito):

:set nowrapscan

Depois, verifique se você tem dois registros claros:

qqq
qaq

Agora, a mágica:

qq/'user': '[a-Z]*'
"Ay//e
@qq

qq inicia a gravação de todos os seus pressionamentos de tecla no registro q . Usar uma letra maiúscula faz com que o vim seja anexado a esse registro, em vez de sobrescrevê-lo. y//e yanks até o final de sua pesquisa. @q chama o registro q (atualmente vazio) como uma macro, e o q final interrompe a gravação. Então, simplesmente:

@q
    
por 29.09.2014 / 18:48

Tags