Forum: PC-Programmierung bash als Substitutionswerkzeug


von Uhu U. (uhu)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von Uhu U. (uhu)


Lesenswert?

Ü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
von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von Uhu U. (uhu)


Lesenswert?

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
Noch kein Account? Hier anmelden.