Sto scrivendo uno script bash per modificare un file di configurazione che contiene un gruppo di coppie chiave, valore. Come posso leggere la chiave e trovare il valore e possibilmente modificarlo?modifica il file di configurazione usando lo script bash
risposta
Una pugnalata selvaggio al buio per la modifica di un singolo valore:
sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE
supponendo che la chiave di destinazione e la sostituzione il valore non contiene caratteri regex speciali e il separatore dei valori-chiave è "=". Nota: l'opzione -c dipende dal sistema e potrebbe essere necessario ometterla per l'esecuzione di sed.
Per altri suggerimenti su come eseguire sostituzioni simili (ad es. Quando il valore REPLACEMENT_VALUE contiene caratteri '/'), there are some great examples here.
-c sembra essere non valido nel mio ambiente. Quando mi libero di -c, funziona. Grazie. –
L'opzione '-c' dice a sed di copiare il file quando lo mischia (invece di ridenominarlo) - impedisce di cambiare proprietario e fare casino con i file di sola lettura. Una di quelle abitudini che ho raccolto per salvarmi da errori stupidi (specialmente con 'find ... | xargs sed -i'). – Cascabel
Ho davvero avuto due downvote per questa risposta? Non solo sono riuscito a indovinare ciò che l'OP voleva, è breve ed efficiente. Qualcuno ha voglia di spiegare? – Cascabel
si supponga che il file di configurazione è in seguito formato:
CONFIG_NUM=4
CONFIG_NUM2=5
CONFIG_DEBUG=n
Nello script bash, è possibile utilizzare:
CONFIG_FILE=your_config_file
. $CONFIG_FILE
if [ $CONFIG_DEBUG == "y" ]; then
......
else
......
fi
$CONFIG_NUM
, $CONFIG_NUM2
, $CONFIG_DEBUG
è quello che ti serve.
Dopo la lettura dei valori, scrivere indietro sarà facile:
echo "CONFIG_DEBUG=y" >> $CONFIG_FILE
Questo non andrà a sostituire il valore, basta inserirlo di nuovo in fondo, è completamente dipendente dal file di configurazione di essere uno script bash valido e ... wow, cosa succede se c'è qualcosa di dannoso nel file di configurazione? – Cascabel
in generale è facile estrarre informazioni con grep e tagliare:
cat "$FILE" | grep "^${KEY}${DELIMITER}" | cut -f2- -d"$DELIMITER"
aggiornare si potrebbe fare qualcosa di simile:
mv "$FILE" "$FILE.bak"
cat "$FILE.bak" | grep -v "^${KEY}${DELIMITER}" > "$FILE"
echo "${KEY}${DELIMITER}${NEWVALUE}" >> "$FILE"
questo non sarebbe mantenere l'ordine della chiave- coppie di valori ovviamente. aggiungi la verifica degli errori per assicurarti di non perdere i tuoi dati.
se si esaurisce lo spazio su disco o se per qualsiasi motivo non è possibile creare "FILE", la soluzione lascerà mancante il file "FILE" (sarà necessario rinominare manualmente "FILE.bak" in "FILE" per ripristinare.) – vladr
Scommetti. è per questo che ho scritto 'aggiungi controllo errori' ecc. :) –
Supponendo che si dispone di un file di key=value
coppie, potenzialmente con spazi intorno alla =
, è possibile eliminare, modificare sul posto o aggiungere coppie chiave-valore a piacimento utilizzando awk
anche se le chiavi o valori contengono sequenze regex speciali:
# 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
Spero che questo aiuti qualcuno. Ho creato uno script autonomo, che richiedeva l'elaborazione di configurazioni di sorta.
#!/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
ho cercato di rispondere a questa qui https://stackoverflow.com/a/47509618/3343801 –