Füllen von Platzhaltern in der Datei in single-pass -
Ich habe ein Skelett text-Datei mit dem Platzhalter-strings:
blah blah blah
blah $PLACEHOLDER_1$
blah
$PLACEHOLDER_2$
und so weiter. Spezifische "form" der Platzhalter spielt keine Rolle-ich kann Sie, was die meisten komfortabel für die konkrete Umsetzung.
Habe ich ein bash-script, wo ich weiß, die Werte für die Platzhalter, und ich brauche zum erstellen einer neuen Datei durch Platzhalter ersetzt mit den Werten.
#! /bin/sh
PLACEHOLDER_1 = 'string 1'
PLACEHOLDER_2 = 'multiline
string
2'
# TODO: Generate file output.txt from file output.template
# using placeholders above.
Kann ich tun, dies in mehreren Durchgängen mit sed, aber es ist kein Spaß. Ich mache nicht verwenden möchten, Perl. Ich will textutils und bash selbst nur.
Was ist der beste Weg, das zu tun, was ich will, in einem Durchgang?
- Sie können keine Leerzeichen um das Gleichheitszeichen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie immer noch sed zu tun, die ersetzen in einem Durchgang. Sie müssen nur angeben, alle Ersetzungen in einem einzigen Befehl.
zB.
sed -i '' 's/PLACEHOLDER_1/string 1/g;s/PLACEHOLDER_2/string 2/g' <file>
... reference:Hier ist ein Weg, dies zu tun, ohne sed:
Erste, eine leicht modifizierte template-Datei, in der die Platzhalter sind bash-Variablen:
Und das Skript:
Hier eine version zeigt, dass eine Vorlage innerhalb der script, aber mit einem twist. Es zeigt auch default-Werte, die auch verwendet werden, in der template-Datei-version, plus Sie können tun Mathe in der Vorlage:
Keine sed, keine loops, nur haarige Schachteln und Zitate. Ich bin mir ziemlich sicher, dass alle das zitieren schützen Sie vor schädlichen Sachen in eine Vorlage-Datei, aber ich werde nicht garantieren.
echo "$(eval "echo \"$template\"")" > $outputfile
nicht für mich arbeiten in einem Skript, aber es funktioniert auf der Kommandozeile. Warum?Aufbauend auf die Vorherige Antwort, vielleicht mit einem array und berechne die sed-string?
Scheint ein Fehler in der multi-line-strings, obwohl.
Ich weiß nicht, wie tragbare Bash arrays sein könnte. Obige snippet getestet mit GNU bash, version 3.2.17(1)-release (i386-apple-darwin9.0)"
Meine bash einzige Lösung:
Ich stolperte über diese Frage, denn ich war gerade auf der Suche nach dem exakt gleichen, und ich fand
envsubst(1)
.Können Sie envsubst, wenn Sie nichts dagegen haben, mit Hilfe von Umgebungsvariablen:
Wenn Sie eine Menge von Variablen Sie können speichern Sie in einer Datei und nur
source
es (daran denkenexport
am Ende des bezogen-Datei!)