sed: Reemplazar valores de variables en un archivo | Algo de Linux

viernes, 7 de agosto de 2015

sed: Reemplazar valores de variables en un archivo

En ocasiones, cuando trabajamos con scripts, nos interesa asignar valores a variables en archivos de configuración, reemplazando los valores que ya hubiera definidos. Esto es algo que podemos hacer fácilmente utilizando el comando sed. Así que vamos a verlo con un ejemplo.

Supongamos que queremos asignar valores a las variables definidas en el archivo /etc/wicd/wired-settings.conf:
[wired-default]
ip = None         
broadcast = None          
netmask = None
gateway = None
search_domain = None
dns_domain = None
dns1 = None
dns2 = None
dns3 = None
beforescript = None
afterscript = None
predisconnectscript = None
postdisconnectscript = None
encryption_enabled = None
default = True
dhcphostname = debian
lastused = True
Como podéis observar, en este archivo se separa cada variable de su valor mediante espacios y un símbolo =
Así que, para asegurarnos de que estamos sustituyendo exactamente lo que queremos, utilizaremos una expresión regular que identifique esta estructura.

Siguiendo con el ejemplo, supongamos que en el fichero anterior queremos sustituir el valor de la variable "ip" y el valor de la variable "gateway". Podríamos hacerlo fácilmente utilizando el siguiente script en el que empleamos sed:
#!/bin/bash
myip="172.19.144.12"
gatewayip="172.19.144.1"
sed -i "s|ip\ \=\ .*|ip = $myip|" wired-settings.conf 
sed -i "s|gateway\ \=\ .*|gateway = $gatewayip|" wired-settings.conf 
Como el quid de la cuestión está en el comando sed, vamos a analizar la estructura del primer comando sed, puesto que el segundo es exactamente igual:
sed -i "s|ip\ \=\ .*|ip = $myip|" wired-settings.conf 
Le estamos diciendo a sed que reemplace el patrón de búsqueda "ip\ \=\ .*" por la expresión "ip = $myip" y que lo haga inline, es decir, directamente en el archivo de configuración wired-settings.conf

El patrón "ip\ \=\ .*" 'buscará' una expresión de la forma "ip = loquesea".

Al ejecutar el comando, el patrón de búsqueda será sustituido por otra expresión "ip = $myip" en la que estamos insertando el valor de una variable, que en este caso es $myip.

De este modo,  podríamos ir sustituyendo todas las variables que queramos.

En otros ficheros de configuración, las variables se definen sin espacios antes y después del símbolo "=" y los valores van entrecomillados. En ese caso, tan sólo tenemos que quitar los espacios que he introducido a propósito en el patrón de búsqueda y añadir las comillas. Veámoslo con otro otro ejemplo:
#!/bin/bash
idiomateclado="es_ES.UTF-8"
sed -i "s|LANG=.*|LANG=\"$idiomateclado\"|" /etc/default/locale
Publicado por primera vez en http://enavas.blogspot.com.es

No hay comentarios: