2010-03-17 32 views

Respuesta

72

Una puñalada salvaje en la oscuridad para modificar un solo valor:

sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE 

suponiendo que la clave de destino y el reemplazo el valor no contiene ningún carácter especial de expresión regular, y su separador de clave-valor es "=". Tenga en cuenta que la opción -c depende del sistema y es posible que deba omitirla para que sed la ejecute.

Para obtener más sugerencias sobre cómo hacer reemplazos similares (por ejemplo, cuando el valor de REPLACEMENT_VALUE tiene '/' caracteres), there are some great examples here.

+7

-c parece no ser válido en mi entorno. Cuando me deshago de -c, funciona. Gracias. –

+0

La opción '-c' le dice a sed que copie el archivo cuando lo mezcla (en lugar de renombrarlo); esto impide cambiar la propiedad y jugar con archivos de solo lectura. Uno de esos hábitos que he elegido para salvarme de errores estúpidos (especialmente con 'find ... | xargs sed -i'). – Cascabel

+1

¿Realmente recibí dos votos a favor por esta respuesta? No solo pude adivinar lo que el OP quería, es corto y eficiente. ¿Alguien quiere explicar? – Cascabel

-1

Supongamos que el archivo de configuración está en formato de abajo:

CONFIG_NUM=4 
CONFIG_NUM2=5 
CONFIG_DEBUG=n 

En su escritura del golpe, que puede utilizar:

CONFIG_FILE=your_config_file 
. $CONFIG_FILE 

if [ $CONFIG_DEBUG == "y" ]; then 
    ...... 
else 
    ...... 
fi 

$CONFIG_NUM, $CONFIG_NUM2, $CONFIG_DEBUG es lo que necesita.

Después de leer los valores, escribir de nuevo será fácil:

echo "CONFIG_DEBUG=y" >> $CONFIG_FILE 
+6

que no va a sustituir el valor, sólo tiene que añadir de nuevo en la parte inferior, que es totalmente dependiente en el archivo de configuración de ser un script válido de bash, y ... wow, ¿y si hay algo malicioso en el archivo de configuración? – Cascabel

1

, en general, es fácil extraer la información con grep y cortar:


cat "$FILE" | grep "^${KEY}${DELIMITER}" | cut -f2- -d"$DELIMITER" 

para actualizar usted podría hacer algo como esto:


mv "$FILE" "$FILE.bak" 
cat "$FILE.bak" | grep -v "^${KEY}${DELIMITER}" > "$FILE" 
echo "${KEY}${DELIMITER}${NEWVALUE}" >> "$FILE" 

esto no mantendría el orden del número- pares de valores obviamente. agregue la verificación de errores para asegurarse de no perder sus datos.

+0

si se queda sin espacio en el disco o si por algún motivo no puede crear 'FILE', su solución dejará' FILE' como falta (uno tendría que cambiar manualmente el nombre 'FILE.bak' a' FILE' para recuperarlo) – vladr

+0

tu apostaste es por eso que escribí 'agregar comprobación de errores', etc. :) –

0

Asumiendo que usted tiene un archivo de key=value pares, posiblemente con espacios alrededor del =, puede eliminar, modificar in situ o añadir pares clave-valor a voluntad usando awk incluso si las claves o valores contienen secuencias de expresiones regulares especiales:

# Using awk to delete, modify or append keys 
# In case of an error the original configuration file is left intact 
# Also leaves a timestamped backup copy (omit the cp -p if none is required) 
CONFIG_FILE=file.conf 
cp -p "$CONFIG_FILE" "$CONFIG_FILE.orig.`date \"+%Y%m%d_%H%M%S\"`" && 
awk -F '[ \t]*=[ \t]*' '$1=="keytodelete" { next } $1=="keytomodify" { print "keytomodify=newvalue" ; next } { print } END { print "keytoappend=value" }' "$CONFIG_FILE" >"$CONFIG_FILE~" && 
mv "$CONFIG_FILE~" "$CONFIG_FILE" || 
echo "an error has occurred (permissions? disk space?)" 
2
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile 
10

Espero que esto ayude a alguien. Creé una secuencia de comandos independiente, que requería un tipo de proceso de configuración.

#!/bin/bash 
CONFIG="/tmp/test.cfg" 

# Use this to set the new config value, needs 2 parameters. 
# You could check that $1 and $1 is set, but I am lazy 
function set_config(){ 
    sudo sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" $CONFIG 
} 

# INITIALIZE CONFIG IF IT'S MISSING 
if [ ! -e "${CONFIG}" ] ; then 
    # Set default variable value 
    sudo touch $CONFIG 
    echo "myname=\"Test\"" | sudo tee --append $CONFIG 
fi 

# LOAD THE CONFIG FILE 
source $CONFIG 

echo "${myname}" # SHOULD OUTPUT DEFAULT (test) ON FIRST RUN 
myname="Erl" 
echo "${myname}" # SHOULD OUTPUT Erl 
set_config myname $myname # SETS THE NEW VALUE 
Cuestiones relacionadas