sh: sed in function auslagern
-
in Ermangelung einer CGI-Scriptsprache auf einem embedded System schreibe ich jetzt ein CGI-Scrip in sh.
Da ich nicht das Layout machen werde, lade ich mir dieses pertext=`cat seitenlayout.txt`
in mein Programm.
Also habe ich jetzt einen htmltext, den ich mit sed mehrfach verändern will, bevor ich ihn ausgebe.
Das ganze sieht dann beispielsweise so austext=`echo $text | sed "s/\%TITLE\%/DocJunioRs Testtext/g" text=`echo $text | sed "s/\%NAME\%/DocJunioRs/g" ...
um das nicht jedes mal neu zu sed'n dachte ich mir, ich schreibs in ne function - einfach der Übersichtlichkeit halber
replaceString () { return `echo "$1" | sed "s/".$2."/".$3."/g"` } ... text=replaceString "$text" "\%TITLE\%" "DocJunioRs TestString"
das bringt bei mir folgenden Fehler
./spscontrol.sh: line 47: <html>
<head>
<title>%TITLE%</title>
</head>
</html>: Datei oder Verzeichnis nicht gefunden
<html> <head> <title>%TITLE%</title> </head> </html>kann mir wer erklären, was ich da (falsch) mache? ^^
-
Ich weiss zwar nicht, was da falsch läuft, aber einen Tipp hätte ich. Gerade auf einem embedded System hat man in der Regel relativ schwache CPUs. CGI und Shell skript ist ja auch nicht gerade schnell, daher empfehle ich ein paar Optimierungen. Deine Codefragmente würde ich so zusammen bauen (ungetestet):
text=`sed " s/%TITLE%/DocJunioRs Testtext/g; s/%NAME%/DocJunioRs/g " <seitenlayout.txt`
Da sparst Du Dir den mehrfachen Aufruf von sed und das mehrfache durch schleusen des Textes über eine Pipe und auch der Aufruf von cat verschwindet hier. Ob Du den Text dann noch unbedingt in einer Variablen "text" speichern musst oder gleich auf stdout ausgibst, kann ich nicht beurteilen. Vielleicht gefällt Dir das ja so gut, dass Du auf die Funktion doch verzichtest
.
Ansonsten für sed kann ich http://www.grymoire.com/Unix/Sed.html empfehlen.
-
klingt interessant. werd ich mir mal in ruhe durch den kopf gehen lassen
-
mal so probiert ? :
replaceString () { ret=`echo "$1" | sed "s/$2/$3/g"` } ... replaceString "$text" "\%TITLE\%" "DocJunioRs TestString" echo "$ret"
-
Das return-Statement ist übrigens sehr seltsam, denn `` fügt die Standardausgabe der ausgeführten Kommandos an dieser Stelle ein und return benutzt man nur um Fehlercodes zurückzugeben, d.h. einen integralen Typ im Bereich 0-255.
Was du willst wäre:
replaceString () { sed "s/.$2./.$3./g" < "$1" } text=`replaceString "$text" "\%TITLE\%" "DocJunioRs TestString"` # Beachte die Backticks hier!!
Sinnvoller fände ich immernoch alle Ersetzung zu akkumulieren und dann ein einziges mal sed aufzurufen.
Benutz du die Bourne Shell, kurz sh, oder eine mächtigere Shell, z.B. Bash?