Herramienta para reemplazar bloque en un archivo

Herramienta para reemplazar bloque en un archivo

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:

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.

información relacionada