Ferramenta para substituir o bloco em um arquivo

0

A maioria das ferramentas de software de gerenciamento de configurações tem uma maneira de substituir um bloco em um arquivo.

Exemplo:

Eu quero exatamente isso, mas sem a sobrecarga dessas grandes ferramentas.

Existe uma ferramenta simples para atualizar um bloco de manutenção no arquivo de texto?

Exemplo: desejo atualizar /etc/some-server/some-server.conf

Eu quero inserir / atualizar um bloco como este:

## start my-block
key1=value1
key2=value2
## end my-block

Eu sei que posso fazer isso com algumas linhas de awk ou python, mas eu procuro uma ferramenta pronta para usar.

    
por guettli 25.10.2016 / 16:35

2 respostas

0

Sed é bom para a substituição de texto. Eu não estou perto de um bash shell para testar isso, mas grosso modo o comando que você precisa / tem prontamente disponível, dado o meu conhecimento limitado do seu problema é

sed '/in lines containing this/cut this/paste this/' in.file >out.file

Também é necessário um formato substituto 's / this / that /' e ideal em uma série de comandos canalizados

    
por 26.10.2016 / 01:10
0

O quão simples isso é depende de como a ferramenta deve se comportar em condições não nominais. Se há sempre exatamente um bloco no arquivo com os comentários especiais, é bastante fácil com o awk, por exemplo.

awk '
    /^## end my-block$/ {skip=0}
    !skip {print}
    /^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf

Se você quiser adicionar o bloco no final, se ainda não estiver presente, ainda não é muito difícil:

awk '
    /^## end my-block$/ {skip=0}
    !skip {print}
    /^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
    END {print "## start my-block"; system("cat new-block-content") || exit(1); print "## end my-block"}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf

Lidar com outros cenários (por exemplo, iniciar comentários, mas não encerrar comentários, vários bloqueios,…) fica progressivamente mais difícil.

    
por 26.10.2016 / 01:29