Wie Sie shell-Variablen in eine text-Datei?
Betrachten Sie einen ASCII-text-Datei (sagen wir, enthält es code von einer nicht-shell-scripting-Sprache):
Text_File.msh:
spool on to '$LOG_FILE_PATH/logfile.log';
login 'username' 'password';
....
Nun, wenn dies ein shell-Skript konnte ich es als $ sh Text_File.msh
und die shell automatisch erweitern Sie die Variablen.
Was ich tun möchte, ist über die shell erweitern Sie diese Variablen und erstellen Sie eine neue Datei als Text_File_expanded.msh
wie folgt:
Text_File_expanded.msh:
spool on to '/expanded/path/of/the/log/file/../logfile.log';
login 'username' 'password';
....
Betrachten:
$ a=123
$ echo "$a"
123
Technisch gesehen, dies sollte den trick tun:
$ echo "`cat Text_File.msh`" > Text_File_expanded.msh
...aber es funktioniert nicht wie erwartet, und die Ausgabe-Datei, während die identisch ist mit der Quelle.
So, ich bin nicht sicher, wie das zu erreichen ist.. Mein Ziel ist, machen es leichter zu pflegen, die Verzeichnis-Pfade eingebettet in meine nicht-shell-Scripte. Diese Skripts enthalten, nicht UNIX-code, da es nicht kompiliert werden von der UNIX-shell.
Derzeit ist es in einfache Anführungszeichen oder ohne umgebende Anführungszeichen an alle in der text-Datei.
Verwandte Frage: superuser.com/q/235738/126693
InformationsquelleAutor Kent Pawar | 2013-01-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Lösung ist zwar nicht elegant, aber es funktioniert. Erstellen Sie ein Skript-Aufruf shell_expansion.sh:
Können Sie rufen Sie dann das Skript wie folgt:
$ LOG_FILE_PATH=/some/path
lief dann$ ./shell_expansion.sh Text_File.msh Text_File_expanded.msh
(und auch$ bash shell_expansion.sh Text_File.msh Text_File_expanded.msh
) - aber in der Text_File_expanded.msh $LOG_FILE_PATH Einträge werden durch Leerzeichen ersetzt Räume. Kann ich dies falsch..Ich hatte nicht
export
ed der Variablen.. Nachdem ich versucht$ export LOG_FILE_PATH=/sone/path/
es geklappt hat. Danke! 🙂super Coole Idee!
Es gibt keine Notwendigkeit für temporäre Dateien verwenden, benutzen Sie einfach
eval
- siehe @ThirteenThirtySeven Antwort. Auch die Methode der Verwendung von temporären Dateien ist etwas problematisch (mehrere Instanzenshell_expansion.sh
schreiben alle auf die gleiche Datei, die Erlaubnis Fragen, Fehlerüberprüfung usw - eine temporäre Datei erstellen, die viele mögliche Komplikationen müssen Sie bereit sein, zu behandeln oder zu wissen, zu vermeiden, mit Sicherheit).eval
ist mehr gefährlich als die Verwendung von temp-Dateien.InformationsquelleAutor Hai Vu
Diese Frage gestellt wurde in einem anderen thread, und das ist die beste Lösung IMO:
wenn Sie auf dem Mac installieren
gettext
erste:brew install gettext
finden Sie unter:
Zwingen bash zu erweitern-Variablen in eine Zeichenfolge aus einer Datei geladen
InformationsquelleAutor Dima Lituiev
Wenn eine Perl-Lösung ist ok für dich:
Beispieldatei:
Lösung:
\w
immer erfassen der shell-Variablen name richtig..?Ok ich goggled und habe meine Antwort - 1. PERL-Referenz: \w Entspricht "Wort" - Zeichen (alphanumerische Zeichen sowie ""). 2. UNIX-shell-Referenz: Der name einer Variablen können nur alphanumerische Zeichen enthalten und mit "".
du hast es korrekt.
Hi Alle - Tippfehler in meinem obigen Kommentar: die
"_"
wurde als nicht markiert code und so wurde Sie benutzt, um den text Kursiv.. Sorry.Ich habe versucht das Skript . es funktioniert fast einwandfrei. Es ersetzen zwar alle env Variablen, unabhängig davon ob Sie definiert sind oder nicht. Ich denke, es wäre sinnvoll, zu vermeiden, ersetzen von Variablen, die nicht definiert sind.
InformationsquelleAutor Guru
Einer Begrenzung der oben genannten Antworten ist, dass Sie beide erfordern die zu exportierenden Variablen werden für die Umwelt. Hier ist, was ich kam mit, die erlauben würde, die Variablen werden lokal auf der aktuellen shell-Skript:
Dem oben genannten Beispiel ermöglicht die variable
$FOO
ersetzt werden, in die Dateien named auf der Kommandozeile. Ich bin mir sicher, dass es verbessert werden kann, aber das funktioniert für mich so weit.Dank der beiden vorherigen Antworten für Ihre Ideen!
trap
reinigen Sie die temporären Dateien. Ich habe vorgeschlagen, einige änderungen, um es einfacher für Neulinge wie mich, um den code zu verstehen; freundlicherweise überprüfen Sie die änderungen und verwerfen Sie wenn notwendig. DankIch habe nicht das signal der
0
verweist.0 bedeutet normal beenden, anstatt ein signal.
Ich bin mir nicht sicher, warum Sie denken Halbfinale auf die Variablen-Zuweisungen und fallen aber keine echos und Katzen, aber die Kommentare sind nützlich, damit ich nicht planen, zu der Sie zurückkehren.
Dank Paul. Über das Halbfinale - nur Hinzugefügt, während das hinzufügen der Kommentare; nicht, dass seine notwendig, nur eine macht der Gewohnheit 🙂
InformationsquelleAutor Paul Gear
Wenn Sie es wollen, in einer Zeile (ich bin kein bash-Experte, so dass es vielleicht Vorbehalte zu diesem, aber es funktioniert überall habe ich es versucht):
wenn test.txt enthält
dann:
Natürlich, wenn Sie nur wollen, um es zu drucken, können Sie nehmen Sie die zusätzliche
value=$()
undecho "$value"
.test.txt
enthält, zum Beispiel"; touch /etc/your_system_is_pwned; echo "
Sie werden sehen, es geschehen Schlimme Dinge.InformationsquelleAutor ThirteenThirtySeven
Wenn die Variablen, die Sie übersetzen möchten, sind bekannt und in Ihrer Anzahl begrenzt sind, können Sie immer tun, die übersetzung selbst:
Und auch vorausgesetzt, die variable selbst ist bereits bekannt
InformationsquelleAutor tvCa
Diese Lösung ermöglicht es Ihnen, um die gleiche Formatierung in der Ausgabe-Datei
Kopieren und fügen Sie die folgenden Zeilen in Ihrem Skript
Lesen der Datei als argument übergeben wird Zeile für Zeile, und dann verarbeiten, um zu versuchen und zu drucken jede Zeile zweimal:
- einmal ohne substitution
- einmal bei der substitution der Variablen.
dann entfernen Sie die doppelten Zeilen
entfernen Sie dann die Linien mit den sichtbaren Variablen ($)
InformationsquelleAutor hcii
Erstellen einer ascii-Datei test.txt mit folgendem Inhalt:
Erstellen Sie nun eine Datei “sub.sed" mit Variablen Namen, z.B.
Öffnen Sie ein terminal, wechseln Sie zu dem Ordner mit test.txt und sub.sed.
Definieren Sie den Wert der Variable ersetzt werden
Rufen Sie nun sed zu ersetzen, dass die variable
Wird die Ausgabe
InformationsquelleAutor mcExchange