J'écris un script bash pour modifier un fichier de configuration qui contient un ensemble de paires clé/valeur. Comment puis-je lire la clé et trouver la valeur et éventuellement la modifier?
Un poignard sauvage dans le noir pour modifier une seule valeur:
sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE
en supposant que la clé cible et la valeur de remplacement ne contiennent pas de caractères regex spéciaux et que votre séparateur clé-valeur est "=". Remarque: l'option -c dépend du système et vous devrez peut-être l'omettre pour que sed puisse être exécuté.
Pour d'autres astuces sur la procédure à suivre pour effectuer des remplacements similaires (par exemple, lorsque REPLACEMENT_VALUE contient les caractères "/"), il existe quelques bons exemples ici .
J'espère que ça aide quelqu'un. J'ai créé un script autonome qui nécessitait un traitement de configuration.
#!/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
En supposant que vous ayez un fichier de paires key=value
, potentiellement avec des espaces autour du =
, vous pouvez supprimer, modifier sur place ou ajouter des paires clé-valeur à volonté à l'aide de awk
même si les clés ou les valeurs contiennent des séquences de regex spéciales
# 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?)"
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile
en général, il est facile d'extraire les informations avec grep et de couper:
cat "$FILE" | grep "^${KEY}${DELIMITER}" | cut -f2- -d"$DELIMITER"
pour mettre à jour vous pourriez faire quelque chose comme ça:
mv "$FILE" "$FILE.bak"
cat "$FILE.bak" | grep -v "^${KEY}${DELIMITER}" > "$FILE"
echo "${KEY}${DELIMITER}${NEWVALUE}" >> "$FILE"
cela ne maintiendrait évidemment pas l'ordre des paires clé-valeur. Ajoutez une vérification d'erreur pour vous assurer de ne pas perdre vos données.