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.

186voto

Malvineous Points 2416

C'est ce que envsubst est pour.

echo 'Hello $USER'
Hello $USER
echo 'Hello $USER' | envsubst
Hello malvineous

Mais vous l'utiliserez probablement plus comme ça :

envsubst < input.txt > output.txt

envsubst semble faire partie de GNU gettext.

10voto

Shawn Chin Points 29756
sed 's/$HOSTNAME/myhost/g;s/$unconfigured//g' yourfile.txt > another_file.txt

mettre à jour :

D'après les mises à jour de votre question, ce ne sera pas une bonne solution.

actualisation2 :

Ceci est basé sur une réponse à une question connexe . J'ai bricolé (je ne suis pas familier avec perl) pour enlever les variables indéfinies.

perl -p -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg; s/\$\{([^}]+)\}//eg' yourfile.txt

Cela devrait fonctionner pour n'importe quel fichier texte d'entrée, mais vous devrez définir des variables à l'aide de la fonction ${...} qui simplifie la correspondance des chaînes de caractères.

( Le discours sur la méchanceté de l'évaluation s'est déplacé vers un poste séparé afin de ne pas confondre les lecteurs )

8voto

Shawn Chin Points 29756

"l'évaluation est un mal"

Il ne s'agit pas d'une réponse, mais d'un avertissement en réponse à utiliser eval pour cette tâche . Vous vraiment vraiment vraiment ne veulent pas faire ça.

Illustration 1 : un fichier modèle malveillant :

HOST_URL=http://$HOSTNAME
STD_CONFIG=http://$HOSTNAME/config
USER_CONFIG=http://$HOSTNAME/config/$unconfigured
&& cat /etc/redhat-release

Un utilisateur peu méfiant :

[lsc@aphek]$ cat somefile | while read line; do echo $(eval echo `echo $line`); done
HOST_URL=http://xyz
STD_CONFIG=http://xyz/config
USER_CONFIG=http://xyz/config/
Red Hat Enterprise Linux WS release 4 (Nahant Update 9)

Notez la dernière ligne !

Maintenant, imaginez les possibilités....

6voto

DarkDust Points 47584

Je le ferais comme ça :

# Set the $HOSTNAME and other variables
# Now evaluate the properties file as a shell script.
. config.properties
# Write the values
cat >somefile <<EOF
HOST_URL=$HOST_URL
STD_CONFIG=$STD_CONFIG
USER_CONFIG=$USER_CONFIG
EOF

Modifier : Ou cette chose très désagréable (je suis sûr qu'il y a une meilleure façon)

for name in HOST_URL STD_CONFIG USER_CONFIG
    echo "$name=$(eval echo `echo '$'$name`)" >>somefile
end

3voto

Andy Whitfield Points 1182

Grâce à @DarkDust, j'ai trouvé ça :

cat somefile | while read line; do echo $(eval echo `echo $line`); done > somefile.replaced

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