Folgendes Problem: Ich habe eine .svg-Graphik in einer bash-Variablen (mit read aus einer Datei eingelesen), die einige Texte der Bauart ${VARIABLE} enthält. Diese Variablen sollen durch aktuelle Werte ersetzt werden - im Prinzip ist das alles mundgerecht für eine Shell und die aktuellen Werte der Variablen sind definiert. Nur: wie kann ich die bash - nicht awk & Co. - dazu bewegen, die Substitution auszuführen? eval geht nicht, denn das versucht, den Inhalt der Graphik zeilenweise als Programm auszuführen.
Eval geht schon, man muss nur mit den entsprechenden Anführungszeichen dafür sorgen, dass zum richtigen Zeitpunkt die richtigen Expansionen vorgenommen werden. So müsste es hinhauen, wenn ich nichts Wichtiges übersehen habe:
1 | txt1='${VAR1} als |
2 | Subs${VAR2}tu${VAR2}onswerkzeug' |
3 | |
4 | VAR1='bash' |
5 | VAR2='ti' |
6 | |
7 | txt2=$(eval echo "\"$txt1\"") |
8 | |
9 | echo "$txt1" |
10 | echo |
11 | echo "$txt2" |
Ausgabe:
1 | ${VAR1} als |
2 | Subs${VAR2}tu${VAR2}onswerkzeug |
3 | |
4 | bash als |
5 | Substitutionswerkzeug |
Schwierig wird es aber dann, wenn die Datei $-Zeichen enthält, die keine Variablennamen einleiten.
:
Bearbeitet durch Moderator
Über diese svg-Zeile fliegt er:
1 | gradientTransform="matrix(0,-0.8875284,0.45378157,0,-2.33147,1053.0765)" /> |
Die öffnende Klammer ist der Verrecker. Da wird wohl doch awk oder sed ran müssen...
:
Bearbeitet durch User
Uhu Uhuhu schrieb: > Über diese svg-Zeile fliegt er: > gradientTransform="matrix(0,-0.8875284,0.45378157,0,-2.33147,1053.0765)" > /> > > Die öffnende Klammer ist der Verrecker. Die Klammer wird nur deswegen als bsonderes Shell-Zeichen interpretiert, weil das Anführungszeichen davor Die Klammer ist gar nicht so schlimm, denn ich habe den String ja extra in Anführungszeichen gesetzt, um die Interpretation solcher Dinge zu verhindern. Aber das Anführungszeichen vor "matrix" macht dieses Bemühen leider zunichte. Damit die Zeichen '"', '`' und '\' innerhalb des Texts von der Shell nicht interpretiert werden, muss man sie vor der Übergabe an eval escapen. Hier ist ein neuer Versuch:
1 | txt1='${VAR1} als |
2 | Subs${VAR2}tu${VAR2}onswerkzeug |
3 | gradientTransform="matrix(0,-0.8875284,0.45378157,0,-2.33147,1053.0765)" /> |
4 | Weitere Spezialzeichen: \ und `' |
5 | |
6 | VAR1='bash' |
7 | VAR2='ti' |
8 | |
9 | txt2="${txt1//\\/\\\\}" |
10 | txt2="${txt2//\"/\\\"}" |
11 | txt2="${txt2//\`/\\\`}" |
12 | txt2=$(eval echo "\"$txt2\"") |
13 | |
14 | echo "$txt1" |
15 | echo |
16 | echo "$txt2" |
Das Problem von $-Zeichen, die nicht zu einem Variablennamen gehören, besteht aber weiterhin. Evtl. ist es geschickter, die Variablen nicht direkt zu expandieren, sondern nacheinander für jede Variable die Search/Replace-Funktion auf den gesamten Text anzuwenden:
1 | txt1='${VAR1} als |
2 | Subs${VAR2}tu${VAR2}onswerkzeug |
3 | gradientTransform="matrix(0,-0.8875284,0.45378157,0,-2.33147,1053.0765)" /> |
4 | Weitere Spezialzeichen: \, ` und ${KEINEVARIABLE}' |
5 | |
6 | txt2="$txt1" |
7 | txt2="${txt2//\$\{VAR1\}/bash}" |
8 | txt2="${txt2//\$\{VAR2\}/ti}" |
9 | |
10 | echo "$txt1" |
11 | echo |
12 | echo "$txt2" |
:
Bearbeitet durch Moderator
Ich habs jetzt mit sed gelöst - das ist zwar nicht so elegant, wie eine Substitution im Kontext der Shell, aber es ist idiotensicher... Danke für deine Hilfe.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.