34 votes

Remplacer les variables d'environnement dans un fichier de propriétés

Sous Linux, disons que j'ai le fichier suivant (par exemple conf.properties) :

HOST_URL=http://$HOSTNAME
STD_CONFIG=http://$HOSTNAME/config
USER_CONFIG=http://$HOSTNAME/config/$unconfigured

Je veux créer un autre fichier avec toutes les variables d'environnement remplacées...par exemple, disons que la variable d'environnement $HOSTNAME est 'myhost' et que $unconfigured n'est pas défini, un script devrait produire la sortie suivante :

HOST_URL=http://myhost
STD_CONFIG=http://myhost/config
USER_CONFIG=http://myhost/config/

Je pensais que cela pourrait être fait en une seule ligne avec une sorte de magie sed/awk, mais je ne suis pas un expert et mes recherches ont été dans la veine, donc j'apprécie toute aide.

Edit :

Je dois préciser que le fichier peut vraiment être un fichier texte de n'importe quel format, par exemple xml. Je veux juste remplacer tout ce qui ressemble à une variable env par ce qui est actuellement défini dans l'environnement.

2voto

Elias Probst Points 262

J'ai utilisé cet oneliner pour remplacer ${VARIABLE} des variables de style dans un fichier :

TARGET_FILE=/etc/apache2/apache2.conf; for VARNAME in $(grep -P -o -e '\$\{\S+\}' ${TARGET_FILE} | sed -e 's|^\${||g' -e 's|}$||g' | sort -u); do sed -i "s|\${$(echo $VARNAME)}|${!VARNAME}|g" ${TARGET_FILE}; done

Je suis sûr que quelqu'un peut faire ça en un tiers de la longueur en utilisant awk se sentir mis au défi ! ;)

1voto

Robert Massaioli Points 6672

Voici un extrait de Javascript que j'aime avoir à portée de main pour résoudre ce problème précis :

// A Javascript version of envsubst for our builds
// Purpose: replace all ocurrences of ${VAR} with the equivalent var from the environment from stdin
var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
});

const environment = process.env;

rl.on('line', function(line) {
  const newLine = line.replace(/\$\{([a-zA-Z0-9_]+)\}/g, function(_match, variable) {
    const envVar = environment[variable];
    return envVar ? envVar : '';
  });

  process.stdout.write(`${newLine}\n`);
});

J'espère que cela aidera quelqu'un d'autre.

0voto

Aneil Mallavarapu Points 1074

Voici une courte ligne simple qui utilise le formatage par accolades de Python pour effectuer la magie en toute sécurité :

contents=\"\"\"`cat $file`\"\"\"; python -c "import os;print $contents.format(**os.environ)"
  • évite l'évaluation du mal
  • permet d'afficher les accolades : utilisez {{ au lieu de {
  • pas besoin de spécifier explicitement les vars lors de l'appel du script.

Par exemple, étant donné le fichier de propriétés settings.properties :

# my properties file
someVar = {MY_ENV_VAR}
curlyBraceVar = has {{curly braces}}

Ensuite, faites la substitution avec :

$ export MY_ENV_VAR="hello"
$ file=settings.properties 
$ contents=\"\"\"`cat $file`\"\"\"; python  -c "import os;print $contents.format(**os.environ)"
# my properties file
someVar = hello
curlyBraceVar = has {curly braces}

Un script est ici : https://raw.githubusercontent.com/aneilbaboo/machome/master/bin/substenv

0voto

user12940451 Points 1

Si vous avez installé nodejs vous pouvez exécuter

npx @utft/tt -e FOO=bar /path/to/input /path/to/output

ou vous pouvez l'exécuter de manière programmatique https://github.com/utftufutukgyftryidytftuv/tt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X