![Herramienta para reemplazar bloque en un archivo](https://rvso.com/image/97243/Herramienta%20para%20reemplazar%20bloque%20en%20un%20archivo.png)
La mayoría de las herramientas de software de gestión de configuración tienen una forma de reemplazar un bloque en un archivo.
Ejemplo:
- Pila de sal:reemplazar bloque
- Ansible:archivo de bloqueo
Quiero exactamente esto, pero sin los gastos generales de estas grandes herramientas.
¿Existe una herramienta sencilla para actualizar y mantener un bloque en un archivo de texto?
Ejemplo: quiero actualizar/etc/some-server/some-server.conf
Quiero insertar/actualizar un bloque como este:
## start my-block
key1=value1
key2=value2
## end my-block
Sé que puedo hacer esto con algunas líneas de awk o python, pero busco una herramienta lista para usar.
Respuesta1
Sed es bueno para reemplazar texto. No estoy cerca de un shell bash para probar esto, pero en términos generales, el comando que necesita/tiene disponible dado mi conocimiento limitado de su problema es
sed '/in lines containing this/cut this/paste this/' in.file >out.file
También requiere un formato sustituto 's/this/that/' y es ideal en una serie de comandos canalizados
Respuesta2
Lo simple que sea esto depende de cómo debe comportarse la herramienta en condiciones no nominales. Si siempre hay exactamente un bloque en el archivo con comentarios especiales, es bastante fácil con awk, por ejemplo.
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
Si desea agregar el bloque al final, si aún no está presente, todavía no es demasiado 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
Hacer frente a otros escenarios (por ejemplo, comentario inicial presente pero no final, bloques múltiples,...) se vuelve cada vez más difícil.