Ferramenta para substituir bloco em um arquivo

Ferramenta para substituir bloco em um arquivo

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

Exemplo:

Quero exatamente isso, mas sem a sobrecarga dessas grandes ferramentas.

Existe uma ferramenta simples para atualizar e manter um bloco em um arquivo de texto?

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

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 do awk ou python, mas procuro uma ferramenta pronta para usar.

Responder1

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

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

Ele também usa um formato substituto 's/this/that/' e é ideal em uma série de comandos canalizados

Responder2

A simplicidade disso depende de como a ferramenta deve se comportar em condições não nominais. Se sempre houver exatamente um bloco no arquivo com 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, comentário inicial presente, mas não comentário final, bloqueios múltiplos, …) torna-se progressivamente mais difícil.

informação relacionada