Substitui uma expressão regular dentro do vim por uma saída produzida por um comando do console com a expressão como seu argumento?

7

digamos que eu tenha um arquivo com o seguinte conteúdo:

This is a _file_ which has some _special_ keywords, that I would _like_ to replace.

Eu posso fazer uma pesquisa e substituir as palavras-chave speical por "% s / _ * _ / something", mas gostaria que "something" fosse uma saída de um comando externo. Isso é possível no vim, ou eu preciso acordar?

    
por tmaric 25.01.2013 / 14:56

3 respostas

10

Sim, você pode. Veja :help sub-replace-special ; o \= permite que você substitua por uma expressão Vim. E system() pode executar um comando externo e retornar sua saída. Veja meu exemplo trivial com hostname . Note que eu tive que usar substitute() para me livrar do (s) caractere (s) de nova linha no resultado.

:%s/_[^_]*_/\=substitute(system('hostname'),'\n','','g')/g

PS: Eu também corrigi seu padrão regexp para corresponder ao seu exemplo.

    
por 25.01.2013 / 15:05
5

Na resposta Ingos, que me ajudou muito, não vejo como referenciar um subpadrão da correspondência e usá-lo como um argumento para o comando shell ("produzido por um comando de console com a expressão como argumento" ).

No meu caso, eu tinha linhas de log da seguinte forma: [<unix timestamp>] <message> , ou seja, [1406844000] foobar . Eu queria incluí-los com o tempo de forma legível.

O comando vim a seguir corresponde ao registro de data e hora (sub-rotina 1) e à mensagem (o restante, sub-sub-rotina 2) e prepends a seqüência de tempo do comando date:

:% s/^\[\(\d\+\)\] \(.*\)$/\=substitute(system('date -d @'.submatch(1)),'\n', '', 'g').': ['.submatch(1).'] '.submatch(2)/

[1406844000] foobar obtém Fr 1. Aug 00:00:00 CEST 2014: [1406844000] foobar .

HTH

    
por 09.10.2014 / 10:54
1

Para substituição de base64 em um arquivo ldiff:

:%s/:: \(.*\)$/\=substitute(': ' . system('echo '.submatch(1).'|base64 -d'),'\n','','g')/
    
por 16.04.2015 / 01:21