A maioria das ferramentas de software de gerenciamento de configuração tem uma maneira de substituir um bloco em um arquivo.
Exemplo:
- SaltStack:substituir bloco
- Ansible:arquivo de bloqueio
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.