Estoy escribiendo un script bash para modificar un archivo de configuración que contiene un conjunto de claves, pares de valores. ¿Cómo puedo leer la clave y encontrar el valor y posiblemente modificarlo?modificar el archivo de configuración usando el script bash
Respuesta
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.
-c parece no ser válido en mi entorno. Cuando me deshago de -c, funciona. Gracias. –
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
¿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
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
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
, 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.
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
tu apostaste es por eso que escribí 'agregar comprobación de errores', etc. :) –
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?)"
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile
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
- 1. Cifrar un archivo usando el script bash shell
- 2. Usando el comando find en el script bash
- 3. cómo modificar el archivo exe.config del script Innosetup
- 4. Cómo modificar el archivo xml usando PHP
- 5. Script Bash para ejecutar el script php
- 6. ¿Cómo modificar el archivo de configuración en clickonce deployment?
- 7. Obtener el directorio de un archivo de script bash en
- 8. Bash Script - Leer archivo binario
- 9. Modificar un paso de parámetro en un script (Bash)
- 10. Bash: ejecutar script en el archivo de guardar?
- 11. Script Bash: determine si se modificó el archivo.
- 12. ¿Cómo leer usando "leer" del descriptor de archivo 3 en el script bash?
- 13. Eliminar entradas duplicadas usando un script Bash
- 14. Modificar Ejecutar el archivo jar
- 15. crear y modificar el archivo xml usando javascript
- 16. ¿Cómo modificar el archivo Excel existente usando PHP?
- 17. ¿Cómo sé el nombre del archivo de script en un script Bash?
- 18. ¿Ejecuta el script bash desde otro script sin esperar a que el script termine de ejecutarse?
- 19. ¿Cómo reemplazar el texto en el archivo de texto usando el script del archivo bat?
- 20. Modificar la configuración de POM desde el código del complemento
- 21. Cómo atrapar el código de salida en el script Bash
- 22. Cómo leer el archivo MANIFEST.MF del JAR usando Bash
- 23. Script bash de autodejección
- 24. Ejecutar el comando cuando se detiene el script bash
- 25. variables de parámetro bash en el problema de script
- 26. Configuración de la variable de entorno en el script ant
- 27. Giro del archivo de registro del script de Bash
- 28. Archivo de registro de script Bash para mostrar continuamente
- 29. Salida automática del script bash shell en el error
- 30. Creando .deb para instalar el programa de script bash
Me trataron de responder a esta aquí https://stackoverflow.com/a/47509618/3343801 –