2 comandos Bash para modificar cadenas en varios archivos a la vez

Considere algunas situaciones en las que necesita modificar cadenas en archivos de texto en sus hosts Linux.

Dependiendo del caso, simplemente editará el archivo directamente en su editor de texto favorito.

[ Check out this article comparing various text editors. ]

Pero, ¿y si hay demasiados archivos? ¿Demasiados cambios? Y además de eso, desea un método más automatizado para realizar esta tarea con precisión, de una manera que también sea repetible y autodocumentada.

¿Te ha llamado la atención? Bien, voy a ampliar.

Índice

Aspectos a tener en cuenta antes de realizar cualquier cambio

Si está usando un entorno de desarrollo integrado (IDE), probablemente ya tenga una función global de búsqueda y reemplazo en varios archivos. En ese caso, tendría la opción de confirmar, caso por caso, qué ocurrencia reemplazar (a menos que esté bastante seguro de que realmente desea reemplazar todo).

Considere los siguientes ejemplos como métodos para realizar este tipo de cambios usando solo la línea de comandos en lugar de un IDE.

Pero es posible que también desee inspeccionar cambios antes de aplicarlos porque, a diferencia de la opción IDE, el método de línea de comando es más inmediato (no se requiere confirmación, por defecto).

En mi escenario de ejemplo, tengo tres archivos que contienen referencias a variables user_name y user_home, que por una buena razón debo cambiar a admin_name y admin_home.

Antes de realizar cualquier cambio, inspecciono las ocurrencias en el directorio actual:

(Roberto Nozaki, CC BY-SA 4.0)

Mmm. puedo ver la cadena user_ en archivos playbook.yml y vars.yml, pero también hay un directorio. Puedo usar el siguiente comando para incluirlo en la búsqueda:

(Roberto Nozaki, CC BY-SA 4.0)

Notar: Como una combinación de find y xargs grep no resalta el canal user_ como en el primer ejemplo, agregué un extra grep comando para resaltar el canal.

En otros escenarios, es posible que deba usar expresiones regulares más elaboradas que el ejemplo anterior para capturar cadenas precedidas por un comentario (#) seguido de cero o más espacios o una combinación de letras mayúsculas y minúsculas. Sí, las expresiones regulares pueden volverse complejas.

A continuación se muestran dos formas de editar cadenas en varios archivos simultáneamente.

1. Cambiar canales en archivos en el mismo directorio

Si solo quisiera cambiar las cadenas en los archivos en el directorio actual, podría usar:

sed -i 's/user_/admin_/g' *.yml

Aquí usé el sed ordenar con el -i argumento para hacer los cambios en su lugar. el /g al final del parámetro significa reemplazar todas las ocurrencias en cada archivo.

2. Modificar las cadenas en los archivos del directorio actual y de los subdirectorios.

En mi escenario de ejemplo, hay archivos en subdirectorios que también deben cambiarse. Para esto uso el find ordenar de nuevo:

find ./ -type f | xargs sed -i 's/user_/admin_/g'

En este caso, uso el find comando con parámetro -type f para devolver solo archivos y no nombres de directorios. el xargs El comando recibirá cada nombre de archivo devuelto por el find comando y aplicar el sed pedido.

[ Download now: A system administrator's guide to IT automation. ]

Concluir

Si sabe exactamente lo que necesita cambiar y está tratando con un canal que se puede reemplazar con seguridad por otro, puede acelerar el proceso usando los comandos que se muestran aquí.

Tenga mucho cuidado con las cadenas que pueden ser comunes en sus archivos: si aplica un cambio global que afecta más de lo que deseaba, es posible que deba volver a sus copias de seguridad (que ciertamente tener, ¿a la derecha?).

Artículos de interés

Subir