So ersetzen Sie $ {} - Platzhalter in eine text-Datei?
Möchte ich pipe die Ausgabe eines "Vorlage" - Datei in MySQL, die Datei mit Variablen wie ${dbName}
durchsetzt. Was ist das Befehlszeilen-Dienstprogramm zum ersetzen diese Instanzen und dump die Ausgabe auf der standard-Ausgabe?
InformationsquelleAutor der Frage Dana the Sane | 2009-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sed!
Gegeben template.txt:
wir müssen einfach sagen:
Dank an Jonathan Leffler für den Tipp weitergeben mehrere
-e
Argumente des gleichensed
Aufruf.InformationsquelleAutor der Antwort user
Update
Hier ist eine Lösung von yottatsa auf eine ähnliche Frage, die nur Ersatz für Variablen wie $VAR oder ${VAR}, und ist eine kurze one-liner
Natürlich, wenn ich und Wort in Ihrer Umgebung, dann ist es nur
Auf meinem Mac sieht es aus wie es installiert wurde, als Teil der gettext und von MacGPG2
Alte Antwort
Hier ist eine Verbesserung zu der Lösung von mogsie auf eine ähnliche Frage, meine Lösung ist es nicht erforderlich, escale doppelte Anführungszeichen, mogsie ' s tut, aber seiner ist ein Einzeiler!
Die Kraft auf diesen beiden Lösungen ist, dass Sie nur ein paar Arten von shell-Erweiterungen, die nicht normal auftreten $((...)), `...`, und $(...), obwohl backslash ist ein escape-Zeichen hier, aber Sie haben keine sorgen zu machen, dass die Analyse hat einen bug, und es hat mehrere Linien einfach gut.
InformationsquelleAutor der Antwort plockc
Verwenden
/bin/sh
. Erstellen Sie ein kleines shell-script setzt die Variablen, und dann analysieren Sie die Vorlage mit der shell selbst. Wie so (edit Griff Zeilenumbrüche korrekt):Datei template.txt:
Datei script.sh:
Ausgabe:
InformationsquelleAutor der Antwort gnud
Dachte ich noch einmal über diese, angesichts der jüngsten Interesse, und ich denke, dass das tool, das ich ursprünglich zu denken war
m4
die makro-Prozessor für die autotools. Anstatt also die variable, die ich ursprünglich angegeben, die Sie verwenden würden:InformationsquelleAutor der Antwort Dana the Sane
template.txt
data.sh
parser.sh
parsed_file.txt
InformationsquelleAutor der Antwort
hier ist meine Lösung mit perl, basierend auf früheren Antworten, ersetzt Umgebungsvariablen:
InformationsquelleAutor der Antwort Thomas
Wenn Sie offen sind mit Perldas wäre mein Vorschlag. Obwohl, gibt es wahrscheinlich einige sed und/oder AWK Experten, die wissen wahrscheinlich, wie dies zu tun ist viel einfacher. Wenn Sie ein komplexeres mapping mit mehr als nur dbName für die Ersetzungen zu erweitern ist das ziemlich einfach, aber Sie könnte genauso gut legen Sie es in einer standard-Perl-Skript an diesem Punkt.
Einen kurzen Perl-Skript etwas zu tun, etwas komplizierter (mit mehreren Tasten):
Wenn Sie nennen Sie das obige Skript als ersetzen-Skript könnte dann wie folgt verwendet werden:
InformationsquelleAutor der Antwort Beau Simensen
Hier ein robuste Bash-Funktiondass - trotz der Verwendung von
eval
- sollte sicher zu benutzen.Alle
${varName}
variable Bezüge in das input-text-erweitert werden, basierend auf dem Aufruf von shell-Variablen.Nichts anderes erweitert: weder variable referenziert, deren Namen nicht eingeschlossen in
{...}
(wie$varName
), noch command substitutions ($(...)
- und legacy-syntax`...`
), noch die arithmetischen Substitutionen ($((...))
- und legacy-syntax$[...]
).Zur Behandlung einer
$
als ein literal\
-Flucht; z.B.:\${HOME}
Beachten Sie, dass die Eingabe wird nur akzeptiert via stdin.
Beispiel:
- Funktion-source-code:
Die Funktion geht davon aus, dass keine
0x1
0x2
0x3
und0x4
control-Zeichen in der Eingabe, weil die chars. intern verwendet werden - da die Funktion Prozesse textdas sollte eine sichere Annahme.InformationsquelleAutor der Antwort mklement0
Erstellen
rendertemplate.sh
:Sowie
template.tmpl
:Rendern der Vorlage:
InformationsquelleAutor der Antwort neu242
Datei.tpl:
script.sh:
InformationsquelleAutor der Antwort user976433
Ich würde vorschlagen, mit so etwas wie Siegel:
https://github.com/gliderlabs/sigil
Es ist kompiliert, um ein einzelnes Programm, so ist es extrem einfach zu installieren auf Systemen.
Dann können Sie mit einem einfachen Einzeiler wie den folgenden:
Dies ist viel sicherer als
eval
einfacher und dann mit regex odersed
InformationsquelleAutor der Antwort spudfkc
Ich diesen thread gefunden, während Fragen, die gleiche Sache. Es inspirierte mich zu dieser (vorsichtig mit den backticks)
InformationsquelleAutor der Antwort GlueC
Viele Möglichkeiten hier, aber dachte, ich würde werfen mir auf dem heap. Es ist perl-basiert, zielt nur Variablen der form ${...}, dauert die Datei zu verarbeiten als argument und gibt die konvertierte Datei auf stdout:
Natürlich bin ich nicht wirklich ein perl-person, so könnte es leicht sein, ein fataler Fehler (funktioniert für mich, obwohl).
InformationsquelleAutor der Antwort sfitts
Kann man das in der bash selbst wenn Sie die Kontrolle über die Konfiguration-Datei-format. Sie müssen nur die Quelle (".") die Konfigurations-Datei und nicht als subshell. Sorgt dafür, dass das Variablen sind, die im Rahmen der aktuellen shell (und weiterhin gibt), anstatt die subshell (wo die variable verschwinden, wenn die subshell beendet).
Wenn deine config-Datei nicht ein shell-Skript, können Sie einfach 'kompilieren' es vor der Ausführung so (die Zusammenstellung hängt vom input-format).
In Ihrem speziellen Fall, könnten Sie so etwas wie:
Dann leiten Sie die Ausgabe von gehen.bash in MySQL und voila, hoffentlich werden Sie nicht Ihre Datenbank zerstören :-).
InformationsquelleAutor der Antwort paxdiablo