Ich habe eine Reihe von Sed-Ersetzungen in einem Bash-Skript und erhalte eine Fehlermeldung bezüglich eines nicht abgeschlossenen `s'-Befehls. So sieht die sed-Linie aus:
sed -n -e "s/TMPFOO1/$FOO1/" -e "s/TMPFOO2/$FOO2/" -e "s/TMPFOO3/$FOO3/" -e "s/TMPFOO4/$FOO4/" -e "s/TMPFOO5/$FOO5/" /home/foo/template > /home/foo/template/finishedresult
Aus irgendeinem Grund mag Bash das nicht und ich bekomme eine Fehlermeldung
sed: -e expression #4, char 69: unterminated `s' command
Was fehlt mir hier? Wie kann ich die Variable von SED eingeben lassen? Es sieht für mich so aus, als wären sie alle beendet.
shell-script
text-processing
sed
Mike B.
quelle
quelle
Antworten:
Sie können eine Variable in einem sed-Befehl nicht sicher interpolieren, da die Ersetzung durch die Shell und nicht durch sed erfolgt. Der Wert der Variablen wird zur sed-Syntax. Zum Beispiel in
"s/TMPFOO1/$FOO1/"
, wenn$FOO1
eine neue Zeile enthält, wird dies einen Syntaxfehler verursachen wie die, die Sie beobachtet. Wenn a$FOO1
enthalten ist/
, wird ders
Befehl beendet und es kann ein Fehler oder die Ausführung anderer Befehle auftreten (wenn nach der/
gültigen sed-Syntax eine gültige sed-Syntax vorliegt).Während Sie einen ersten Durchgang durchführen können
FOO1
, um die Sonderzeichen für die Aufnahme in diesen sed-Befehl zu zitieren, ist die Verwendung von awk viel einfacher. Awk hat einen Variablenbegriff und eine Befehlszeilensyntax zum Festlegen des Anfangswertes einer Variablen.quelle
-v
Vor jeder Variablendeklaration muss a stehen.Höchstwahrscheinlich enthält eine Ihrer
$FOO
Variablen Sonderzeichen, die von interpretiert werdensed
.Ich habe eine andere Version
sed
, die andere Fehlermeldungen generiert, aber hier ist ein Beispiel für ein ähnliches Problem:In diesem Fall
$VAR
enthält ein Zeichen, dassed
als abschließender Schrägstrich interpretiert wird .quelle
Wie andere hier erwähnt haben, hängt dies vom Inhalt Ihrer FOO * -Variablen ab. In Ihrem Fall ist die Verwendung
sed
die falsche Wahl, da sie wahrscheinlich einige Sonderzeichen enthält.Schauen Sie sich diesen Link an und sehen Sie sich die Funktion an
gsub_literal
Da
gsub_literal
von stdin gelesen und in stdout geschrieben wird, lautet die Verwendung:gsub_literal "$search" "$replace" < /home/foo/template > /home/foo/template/finishedresult
Beispielausgabe:
quelle
Das Problem wurde für mich behoben, indem zusätzliche Backslashes innerhalb des
sed 's/.../.../g'
Befehls versucht wurden . Dieser Befehlgab mir diese Fehlermeldung
wenn es als Teil eines C-Shell-Skripts ausgeführt wurde, und dies nur mit einer neueren Version von
sed
, nicht mit einer älteren Version. (Seltsamerweise funktioniert der gleiche Befehl einwandfrei, wenn er in der Befehlszeile (in einer TC-Shell) angegeben wird.)Das Problem mit dem C-Shell-Skript wurde behoben, indem dem
ä
Zeichen ein Backslash vorangestellt wurde :quelle