bash als Substitutionswerkzeug

OP #3559370
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.
Moderator #3559430
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.
Moderator #3559667
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"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren