Shell Script para realizar el reemplazo de strings en un archivo

El reemplazo de strings es el proceso de reemplazar una string con otra en un bloque particular de código, texto o todo el archivo. Hay instancias en las que necesitamos reemplazar una string con otra, pero hay muchas instancias de tales strings. Hay dos soluciones aquí; puede reemplazar manualmente todas las strings una por una o escribir algunos comandos para reemplazar una string con otra a la vez. La última solución reduce los esfuerzos y ahorra tiempo, y también brinda exposición a algunos comandos y utilidades de Linux.

Acercarse

El enfoque para el reemplazo de strings en un archivo es bastante simple y directo. Necesitamos ingresar el nombre del archivo, la string existente y la nueva string que será sustituida por el usuario. Podemos reemplazar la string en todo el archivo o en una parte específica mencionada por las líneas de inicio y final. Entonces, para eso, necesitaremos una condición if-else para verificar el reemplazo de la string de archivo completa o una parte específica. Usaremos el comando sed para hacer el reemplazo real. Finalmente, imprimiendo los cambios en el archivo.

Explicación

Tenemos que resolver el problema por partes. En primer lugar, la entrada del usuario para las strings sustituidas y luego la elección de un reemplazo en el bloque o en el archivo completo. Usar el comando SED para reemplazar realmente las strings y finalmente imprimir el archivo.

Entrada del usuario

En primer lugar, necesitaremos el nombre del archivo con el que vamos a realizar la operación de sustitución de strings. Además, necesitaremos ingresar las strings reales que se reemplazarán en el archivo. Usaremos la función de lectura que le indica al usuario un mensaje apropiado y lo almacenará en la variable. 

#!/bin/bash
read -p "Enter the file name : " file
read -p "Enter the old string to be replaced : " old
read -p "Enter the new string to be replaced : " new

Opción de reemplazo (si/si no)

Después de la entrada de la string y el archivo, debemos solicitar al usuario que reemplace la string en todo el archivo o entre líneas específicas en el archivo. Para eso podemos hacer uso de sentencias condicionales if-else. Primero, reemplazaremos la string en todo el archivo, como una pregunta de sí/no. Si es así, reemplace la string en todo el archivo; de lo contrario, ingrese las líneas de inicio y final del archivo donde se debe reemplazar la string. 

#!/bin/bash
read -p "Enter the file name : " file
read -p "Enter the old word to be replaced : " old
read -p "Enter the new word to be replaced : " new

echo -e "\nFile" $file "before replacement\n\n" 
echo -e '\n... Opening' $file ' ...\n\n'
cat $file
echo -e '\n'

read -p "Do you want to replace the string in entire file ? (y/n) : " yn 
if [[ $yn == 'y' || $yn == 'Y' ]]; then
    #replace string in entire file

elif [[ $yn == 'n' || $yn == 'N' ]]; then
    read -p "Enter the line number to start replacement from : " start
    
    # replace string in between mentioned lines only
    read -p "Enter the number of lines after start to end the replacement : " end
else
    echo -e '\nInvalid Input\n'
    echo -e '\nNo changes applied\n'
fi

En el código anterior, hemos creado un bloque if-else que genera una pregunta y/n y realiza el reemplazo en consecuencia. El aspecto principal de reemplazar la string en el archivo se cubre en la siguiente sección.

Comando SED

El comando sed significa editor de flujo, y es una herramienta bastante poderosa para editar archivos o textos de forma rápida usando comandos y sin abrir un editor de texto. Será el aspecto principal de reemplazar la operación de string. Ahora podemos reemplazar la string anterior con la nueva string usando el comando sed en el siguiente formato:

sed -i "s|$old|$new|g" $file

Lo anterior es un comando SED que toma las tres variables en bash y reemplaza la string en todo el archivo. El parámetro -i realiza cambios directamente en el nombre del archivo original proporcionado al final. La palabra clave s especifica que la operación realizada en el siguiente comando es sustitución. El parámetro g indica aplicar una sustitución a lo largo de toda la línea. También podemos especificar los cambios que se realizarán solo en líneas específicas utilizando el siguiente formato:

sed -i "4,+7 s|$old|$new|g" $file

El comando anterior sustituye la string desde la línea 4 hasta la 11 (4+7 = línea 11). El comando sed se puede utilizar según el caso de uso y como sustitución de pares. El comando anterior comienza con el número de línea y se detiene hasta que el contador alcanza el valor menos uno, es decir, el contador es un índice basado en 0. Si solo desea reemplazar una sola línea, puede usar un número de línea con +0 que indica solo una línea y así sucesivamente.

Al final, imprimiremos el archivo con el reemplazo realizado y finalizaremos el script. Además, imprima un error si la entrada no fue válida.

Guion

#!/bin/bash
read -p "Enter the file name : " file
read -p "Enter the old word to be replaced : " old
read -p "Enter the new word to be replaced : " new

echo -e "\nFile" $file "before replacement\n\n" 
echo -e '\n... Opening' $file ' ...\n\n'
cat $file
echo -e '\n'

read -p "Do you want to replace the string in entire file ? (y/n) : " yn 
if [[ $yn == 'y' || $yn == 'Y' ]]; then
    sed -i "s|$old|$new|g" $file

elif [[ $yn == 'n' || $yn == 'N' ]]; then
    read -p "Enter the line number to start replacement from : " start
    read -p "Enter the number of lines after start to end the replacement : " end
    sed -i "$start,+$end s|$old|$new|g" $file
else
    echo -e '\nInvalid Input\n'
    echo -e '\nNo changes applied\n'
if
echo -e '\n... Opening' $file ' ...\n\n'
cat $file
echo -e '\n'

La secuencia de comandos anterior puede sustituir la string por completo en el archivo o puede solicitar un rango de líneas para reemplazar. Los comandos sed se usan con variables como new, old, que son strings, y start y end, que son la cantidad de líneas que se usan para reemplazar el texto en el archivo.

Capturas de pantalla del guión

En la captura de pantalla anterior, la string «ganar» se reemplaza con «nuevo» en todo el archivo. El script imprime el archivo antes y después de reemplazarlo para la referencia del usuario.

En la captura de pantalla anterior, la string «fold» se reemplaza con «gold» solo en las 3 líneas de 4 a 6. Por lo tanto, el reemplazo funcionó tanto en todo el archivo como entre líneas también.

 Entonces, a partir de los scripts anteriores, pudimos reemplazar las strings en el archivo. Si no se encuentra la string de entrada, no cambiará el contenido del archivo y lo devolverá tal como está. 

Publicación traducida automáticamente

Artículo escrito por meetgor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *