Hallo zusammen, ich möchte mittels eines Shell-Skriptes als Ersetzungstext einen Backslash "\" einfügen: #!/bin/bash PXPATH="Adap_(Adap)" echo "PXPATH: $PXPATH" BASEDIR=`echo $PXPATH | sed "s/(/\\(/g"` echo "Base: $BASEDIR" >> ausgabe.conf Da das generierte Ausgabe-File "ausgabe.conf" als Konfigdatei für weitere Dateioperationen verwendet werden soll, müssen die Klammern mit einem Backslash versehen werden. Zu Testzwecken habe mir ich obiges Testskript geschrieben. Leider bekomme ich es nicht auf die Reihe, den Backslash mittels sed in die Variable $BASEDIR zu bekommen. Über Lösungsvorschläge bedanke ich mich schon jetzt. Gruß Andreas Rau
BASEDIR=`echo $PXPATH | sed "s/(/\\(/g"` Aud die Schnelle hat das bei mir gefruchtet:
BASEDIR=`echo $PXPATH | sed "s/(/\\\(/g"` Aber frag mich nicht wieso. Ich bin da selber noch am Gruebeln. In diversen Unterlagen habe ich nichts dazu gefunden. Gruss, ulrich -- Ulrich Hiller Max-Planck-Institut fuer Astronomie Koenigstuhl 17 69117 Heidelberg Germany phone +49 6221 528238 fax +49 6221 528246 email hiller@mpia.de
Am Freitag, 21. Januar 2005 18:38 schrieb Ulrich Hiller:
BASEDIR=`echo $PXPATH | sed "s/(/\\(/g"`
Aud die Schnelle hat das bei mir gefruchtet:
BASEDIR=`echo $PXPATH | sed "s/(/\\\(/g"`
oder: BASEDIR=`echo $PXPATH | sed 's/(/\\(/g'`
Aber frag mich nicht wieso. Ich bin da selber noch am Gruebeln. In diversen Unterlagen habe ich nichts dazu gefunden.
Das liegt daran, wie "" bzw. '' den umschlossenen Inhalt vor dem Auswerten durch die Shell schützen. Näheres dazu sollte in man bash zu finden sein. Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
Hallo, Am Fri, 21 Jan 2005, Jan Trippler schrieb:
Am Freitag, 21. Januar 2005 18:38 schrieb Ulrich Hiller:
BASEDIR=`echo $PXPATH | sed "s/(/\\(/g"`
Aud die Schnelle hat das bei mir gefruchtet:
BASEDIR=`echo $PXPATH | sed "s/(/\\\(/g"`
oder: BASEDIR=`echo $PXPATH | sed 's/(/\\(/g'`
Oder gleich (um der Folgefrage vorzugreifen): BASEDIR="`echo \"$PXPATH\" | sed 's/\([()]\)/\\\\\1/g'`"
Aber frag mich nicht wieso. Ich bin da selber noch am Gruebeln. In diversen Unterlagen habe ich nichts dazu gefunden.
Das liegt daran, wie "" bzw. '' den umschlossenen Inhalt vor dem Auswerten durch die Shell schützen. Näheres dazu sollte in man bash zu finden sein.
Und wie sed das dann auch noch auswertet... ;) -- Die Steuern müssen nicht gesenkt werden, die Steuern müssen bezahlt werden! -- Volker Pispers in "Scheibenwischer"
Hallo habe eben mal Eure Lösungsvorschläge getestet:
Am Fri, 21 Jan 2005, Jan Trippler schrieb:
Am Freitag, 21. Januar 2005 18:38 schrieb Ulrich Hiller:
BASEDIR=`echo $PXPATH | sed "s/(/\\(/g"`
Hatte ich ursprünglich auch gedacht -> geht nicht
Aud die Schnelle hat das bei mir gefruchtet:
BASEDIR=`echo $PXPATH | sed "s/(/\\\(/g"`
Auch dies hatte ich schon probiert -> geht nicht
Oder gleich (um der Folgefrage vorzugreifen):
BASEDIR="`echo \"$PXPATH\" | sed 's/\([()]\)/\\\\\1/g'`"
Das isses !!! David Du bist halt immer wieder ein Held ;-)
Und wie sed das dann auch noch auswertet... ;)
Tsja das interessiert mich jetzt schon. Mir ist klar, dass mittels regexp die Klammern selektiert werden und dann mittels "\1" wieder im Ersetzungsteil von sed wieder dereferenziert werden. Aber warum benötige ich vier Backslashes "\\\\" damit in BASEDIR gerade mal einer angezeigt wird? Grüße Andreas Rau
Hallo Andreas, hallo Leute, bevor die Mail noch länger hier rumliegt, schreib ich lieber eine knappe Antwort. Am Freitag, 21. Januar 2005 23:17 schrieb Andreas Rau: [...]
BASEDIR="`echo \"$PXPATH\" | sed 's/\([()]\)/\\\\\1/g'`"
Das isses !!! David Du bist halt immer wieder ein Held ;-)
Und wie sed das dann auch noch auswertet... ;)
Tsja das interessiert mich jetzt schon. Mir ist klar, dass mittels regexp die Klammern selektiert werden und dann mittels "\1" wieder im Ersetzungsteil von sed wieder dereferenziert werden. Aber warum benötige ich vier Backslashes "\\\\" damit in BASEDIR gerade mal einer angezeigt wird?
Weil an diversen Stellen escapt werden muss. Die Bash braucht erstmal Escaping, vom sed 's/\([()]\)/\\\\\1/g' [1] kommt bei sed s/\([()]\)/\\\1/g an. So, und weil der Backslash in sed auch eine Sonderbedeutung hat, ist auch sed-seitig Escaping nötig. Damit halbiert sich die Anzahl der Backslashes nochmal ;-) und Du hast Deinen einzelnen Backslash. Gruß Christian Boltz [1] was mir gerade aufgefallen ist: das "\1" (sowie "\(" und "\)" hätte strenggenommen auch escapt werden müssen -> "\\1" (usw.), also noch ein Backslash mehr. -- Um es auf dein Beispiel zu übertragen: [...] - oder - Wir stehen sowieso mit runtergelassener Unterhose mitten auf der Autobahn 7 und es ist relativ egal, ob wir jetzt noch eine Gummi-Hupe und eine Taschenlampe in der Hand halten, während ein Tanklaster auf uns zuhält. [Ratti in fontlinge-devel]
participants (5)
-
Andreas Rau
-
Christian Boltz
-
David Haller
-
Jan.Trippler@t-online.de
-
Ulrich Hiller