Bash Scripting comandos VIM

2

Eu tenho alguns arquivos para os quais tenho um grupo irritantemente repetitivo de comandos VIM. Eles são comandos VIM básicos apenas para excluir algumas linhas que não são suportadas pelo processo que eu preciso dos arquivos.

Digamos que eu tenha um arquivo chamado postgresdb.out

Neste arquivo eu irei

vim ./postgresdb.out

Então de dentro do VIM eu vou

:%s/old/new/g

e depois

:g/deletethis/d

seguido por

:%s/\n\n//g

salve o arquivo e siga o meu dia

Gostaria de saber se é possível escrever um script bash que possa fazer esse processo em vez de redigitar o tempo todo

    
por Trent 18.02.2015 / 09:00

2 respostas

2

Alternativas

A menos que você realmente precise de recursos especiais do Vim, provavelmente é melhor usar ferramentas não interativas como sed , awk ou Perl / Python / Ruby / seu favorito linguagem de script aqui .

Dito isso, você pode usar o Vim não interativamente:

Modo em lote silencioso

Para um processamento de texto muito simples (ou seja, usando o Vim como um 'sed' ou 'awk' aprimorado, talvez apenas aproveitando as expressões regulares aprimoradas em um comando :substitute ), use Ex-mode .

REM Windows
call vim -N -u NONE -n -i NONE -es -S "commands.ex" "filespec"

Nota: o modo de lote silencioso ( :help -s-ex ) atrapalha o console do Windows, portanto, talvez seja necessário fazer um cls para limpar após a execução do Vim.

# Unix
vim -T dumb --noplugin -n -i NONE -es -S "commands.ex" "filespec"

Atenção: o Vim irá aguardar pela entrada se o arquivo "commands.ex" não existir; melhor verificar de antemão para a sua existência! Alternativamente, o Vim pode ler os comandos do stdin. Você também pode preencher um novo buffer com o texto lido de stdin e ler os comandos do stderr se você usar o argumento - .

Automação completa

Para um processamento mais avançado envolvendo várias janelas e a automação real do Vim (onde você pode interagir com o usuário ou deixar o Vim em execução para permitir que o usuário assuma o controle), use:

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"

Aqui está um resumo dos argumentos usados:

-T dumb           Avoids errors in case the terminal detection goes wrong.
-N -u NONE        Do not load vimrc and plugins, alternatively:
--noplugin        Do not load plugins.
-n                No swapfile.
-i NONE           Ignore the |viminfo| file (to avoid disturbing the
                user's settings).
-es               Ex mode + silent batch mode -s-ex
                Attention: Must be given in that order!
-S ...            Source script.
-c 'set nomore'   Suppress the more-prompt when the screen is filled
                with messages or output to avoid blocking.
    
por 18.02.2015 / 12:33
1

edição automática deve ser feita usando sed(1) (veja man sed )

Os elogios que você está procurando são

 sed -i -e s/old/new/g -e /deletethis/d -e '/^$/d' postgresdb.out

Não tenho certeza do que você espera com :%s/\n\n//d .

onde

  • -i significa editar no local (normalmente o sed irá produzir uma saída padrão)
  • -e ... faz a edição / deleção
  • -e '/^$/d' shoudl exclui linhas vazias
por 18.02.2015 / 09:09