Ich schreibe ein Skript, das den sed-Befehl verwendet, um in einer Datei die spezifische Kennung zu ersetzen. Derzeit sind die sed-Befehle im Skript fest codiert
Ex-Strom-Methode:
s*ed 's/@Number@/ ' "${Number}" '/g; s/@Value@/ ' "${Value}" '/g;
s/@Socket@/ ' "${Socket}" '/g' File_Template > index.html*
Da der sed-Befehl nicht mehr fest codiert ist und wir viele Prozesse mit unterschiedlichen sed-Anforderungen ausführen, möchte ich so etwas tun
Ziel:
INITIALIZE_SED_COMMAND='s/@Number@/ ' "${Number}" '/g;
s/@Value@/ ' "${Value}" '/g;
s/@Socket@/ ' "${Socket}" '/g;'
# Some logic happens here
INITIALIZE_SED_COMMAND="$INITIALIZE_SED_COMMAND File_Template > index.html" ;
sed $INITIALIZE_SED_COMMAND
Dies hat auf einer Linux-Plattform als .sh
Skript funktioniert, aber ich muss es in tun ksh unix
und erhalte ständig die Meldung „Kann nicht analysiert werden“.
FEHLER:
sed: Datei s/@Number@/npdsfg/g; kann nicht gefunden oder geöffnet werden.
sed: Datei s/@Value@/SQR kann nicht gefunden oder geöffnet werden.
sed: Datei #s/@Socket/semi_/g; kann nicht gefunden oder geöffnet werden.
Antwort1
Dies ist keine Folge des Wechsels von einem Linux-basierten System zu einem nicht-Linux-basierten System (vielleicht AIX?). Es liegt ein grundlegendes Missverständnis darüber vor, wie die Shell Befehle analysiert und ausführt.
Sie können dies nicht schreiben und erwarten, dass ein Zeitstempel in eine Datei geschrieben wird:
v="date > /tmp/date.txt"
$v
Ebenso können Sie dies nicht schreiben und es Ersetzungen durchführen lassen und die Ergebnisse in eine Ausgabedatei schreiben
v="s/abc/XYZ/ /tmp/source > /tmp/destination"
sed $v
Die Dateiumleitung kann innerhalb der Variable nicht angegeben werden.
Ich glaube, Sie suchen nach einer sed -f
Möglichkeit, eine Datei mit Ersetzungen zu erstellen und diese auf eine Quelldatendatei anzuwenden:
#!/bin/ksh
# Usage: thisprogram <transform_file> <src_file> <dst_file>
#
transform="$1"
src="$1"
dst="$2"
sed -f "$transform" "$src" >"$dst"
Die Transformationsdatei kann folgende Vorgänge enthalten:
s/@Number@/1234/g
s/@Value@/somevalue/g
s/@Socket@/99b44/g
Natürlich müssen Sie dies im Rahmen der jeweiligen Ausführung vorbereiten.
Wenn Ihre Frage detaillierter wäre, könnte diese Lösung möglicherweise weiterentwickelt werden. Ich vertraue jedoch darauf, dass Sie über genügend Informationen verfügen, um sie für Ihren speziellen Anwendungsfall zu überarbeiten.