Das ersetzen von Umgebungsvariablen in einer properties-Datei
In Linux, sagen, ich habe die folgende Datei (z.B. conf.Eigenschaften):
HOST_URL=http://$HOSTNAME
STD_CONFIG=http://$HOSTNAME/config
USER_CONFIG=http://$HOSTNAME/config/$unconfigured
Möchte ich eine neue Datei erstellen mit allen Umgebungsvariablen ersetzt...z.B. sagen, dass die Umgebungsvariable $HOSTNAME "myhost" und $unkonfigurierte ist nicht festgelegt, ein Skript erzeugt die folgende Ausgabe:
HOST_URL=http://myhost
STD_CONFIG=http://myhost/config
USER_CONFIG=http://myhost/config/
Ich dachte, dies könnte getan werden, in einer einfachen one-liner mit einer Art von sed/awk-Magie, aber ich bin kein Experte und meine sucht wurde in Gang, so jede Hilfe zu schätzen wissen.
Edit:
Sollte ich noch erwähnen, dass die Datei wirklich jedes format text-Datei, zum Beispiel xml. Ich will einfach nur, etwas zu ersetzen, das aussieht wie eine env-variable mit dem, was ist derzeit in der Umwelt.
InformationsquelleAutor Andy Whitfield | 2011-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
update:
Basiert auf updates, die in Ihrer Frage, ist das nicht eine gute Lösung sein.
update2 :
Diese basiert auf einem Antwort auf einer ähnlichen Frage. Ich habe gehackt (ich bin nicht vertraut mit perl) zu entfernen undefiniert vars.
Sollte für jede Eingabe text-Datei, aber Sie brauchen, um zu definieren vars mit der
${...}
- format, das vereinfacht das string matching.(rant über die Boshaftigkeit von eval verschoben separate post um nicht zu verwirren die Leser)
sed -e 's/$HOSTNAME/myhost/' -e 's/$unconfigured//
...Vorausgesetzt, ich kenne die env-Variablen in den config-Dateien konnte ich diese Technik verwenden, aber ich möchte wirklich etwas mehr Generika.
Danke! Ich werde wahrscheinlich verwenden Sie diese, wie ich die
${}
Stil und der Verwendung von Eigenschaften.Ich denke, der perl-Befehl vereinfacht werden können, um
perl -p -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : ""/eg' yourfile.txt
basierend auf Kommentare auf die zugehörige Frage, anstatt eine 2. regex zum entfernen von leeren Variablen. Sie brauchen einfach zu ersetzen$&
mit""
regex hat den Vorteil, nicht backslash entfernen
InformationsquelleAutor Shawn Chin
Dies ist, was
envsubst
ist.Würden Sie wahrscheinlich verwenden es für mehr wie dieses aber:
envsubst
scheint Teil von GNU gettext.Ich möchte nur sagen, vielen Dank für diese Antwort. Mein Freund und ich hatten Mühe mit sed, awk und anderen "tricks" und diese Antwort hat uns gerettet. Wissen ist macht. Danke!!!
Dies sollte die akzeptierte Antwort.
InformationsquelleAutor Malvineous
Ich würde es so machen:
Bearbeiten: Oder diese sehr unangenehme Sache (ich bin sicher, es gibt eine bessere Weise)
Ich kann nicht davon ausgehen, die Datei ist ein gültiges shell-Skript (nur name=Wert) - es kann ein beliebiges format, zum Beispiel xml.
Whitfield: schade 🙂 Dann bist du off, awk/sed.
Dein edit hat meine Idee: dieses kleine nugget:
cat somefile | while read line; do echo $(eval echo
echo $line); done
Die Formatierung kommt nicht so gut in den Kommentar hier, also ich ' ll fügen Sie es als eine Antwort auf die Referenz.
InformationsquelleAutor DarkDust
"eval is evil"
Dies ist nicht eine Antwort, aber eine Warnung in Reaktion auf die Verwendung von eval für diese Aufgabe. Sie wirklich wirklich wirklich nicht wollen, das zu tun.
Anlage 1: eine schädliche Datei Vorlage:
Einen ahnungslosen Benutzer:
Beachten Sie die Letzte Zeile!
Nun, sich vorstellen, die Möglichkeiten....
InformationsquelleAutor Shawn Chin
Dank @DarkDust ich kam mit dieser:
$
außer für die Variablen.VERWENDEN SIE BITTE NICHT. Verzeihen Sie die Stimme erhoben, aber dies ist eine situation, wo Schreien gerechtfertigt ist. Siehe Erklärung in meiner Antwort.
Keine probs - danke für die Warnung. Ich werde mit den perl-line - funktioniert wie ein Charme.
Ich war mehr besorgt über ahnungslose Benutzer, die möglicherweise über ihn kommen, in die Zukunft. Gepostet Warnung als ein separates Element, so dass Sie nicht zu Verwirrung führen.
InformationsquelleAutor Andy Whitfield
Habe ich diese oneliner zu ersetzen
${VARIABLE}
Stil von Variablen in einer Datei:Ich bin mir ziemlich sicher, dass jemand dies tun kann, in 1/3 der Länge mit
awk
... herausgefordert fühlen! 😉InformationsquelleAutor Elias Probst
Hier ist eine kurze one-liner, verwendet python geschweifte Klammer formatieren, um sicher zu zaubern:
{{
statt{
Beispiel properties Datei
settings.properties
:Dann, machen Sie die substitution mit:
Einem Skript ist hier: https://raw.githubusercontent.com/aneilbaboo/machome/master/bin/substenv
echo '"""; print "arbitrary code execution"; """' > ~/myfile;
erstellt eine Datei, die bewirkt, dass einige von beliebigem code ausgewertet werden.InformationsquelleAutor Aneil Mallavarapu
Hier ist ein Ausschnitt von Javascript, die ich mag zu haben, um für die Lösung genau dieses Problems:
Hoffentlich hilft jemand anderes.
InformationsquelleAutor Robert Massaioli