Hi Ich bin mal wieder auf ein Problem mit sed gestoßen. Ich dachte schon ich hätte die Art und Weise wie was an welcher Stelle expandiert/interpretiert wird verstanden. Ich möchte in einem file ' durch \' ersetzen. So Sachen wie sed 's/\'/\\\'/' gehen aber iregndwie überhaupt nicht. Weiß einer rat. mfg Axel
On Thursday 09 October 2003 11:15, Axel Heinrici wrote:
Hi
Ich bin mal wieder auf ein Problem mit sed gestoßen. Ich dachte schon ich hätte die Art und Weise wie was an welcher Stelle expandiert/interpretiert wird verstanden. Ich möchte in einem file ' durch \' ersetzen. So Sachen wie sed 's/\'/\\\'/' gehen aber iregndwie überhaupt nicht.
linux:~> more xx Dat is'sser nu'aber auch linux:~> sed 's/'\''/\\/g' xx sed 's/'\''/\\/g' xx + sed 's/'\''/\\'\''/g' xx Dat is\sser nu\aber auch Andreas PS: Nicht schön, aber geht!
On Thursday 09 October 2003 11:35, Andreas Kyek wrote:
On Thursday 09 October 2003 11:15, Axel Heinrici wrote:
Hi
Ich bin mal wieder auf ein Problem mit sed gestoßen. Ich dachte schon ich hätte die Art und Weise wie was an welcher Stelle expandiert/interpretiert wird verstanden. Ich möchte in einem file ' durch \' ersetzen. So Sachen wie sed 's/\'/\\\'/' gehen aber iregndwie überhaupt nicht.
linux:~> more xx Dat is'sser nu'aber auch linux:~> sed 's/'\''/\\/g' xx sed 's/'\''/\\/g' xx + sed 's/'\''/\\'\''/g' xx Dat is\sser nu\aber auch
Andreas
PS: Nicht schön, aber geht!
Fehler bei copy und paste: linux:~> more xx Dat is'sser nu'aber auch linux:~> sed 's/'\''/\\'\''/g' xx Dat is\'sser nu\'aber auch Andreas (der sich jetzt mit seiner Grippe ins Bett legt und nicht mehr gestört werden will)
Hallo, Am Thu, 09 Oct 2003, Andreas Kyek schrieb:
Fehler bei copy und paste:
linux:~> more xx Dat is'sser nu'aber auch linux:~> sed 's/'\''/\\'\''/g' xx Dat is\'sser nu\'aber auch
Jo, nu passts.
Andreas (der sich jetzt mit seiner Grippe ins Bett legt und nicht mehr gestört werden will)
Gute Besserung! -dnh --
And I was happy, *happy*, do you understand? Happy... happy... where'es that dictionary? *flip*flip*flip* Oh, what an interesteing concept. I think I'd like to try that out someday. -- Shalon Wood and Graham Reed in the SDM
Hallo, Am Thu, 09 Oct 2003, Axel Heinrici schrieb:
Ich bin mal wieder auf ein Problem mit sed gestoßen. Ich dachte schon ich hätte die Art und Weise wie was an welcher Stelle expandiert/interpretiert wird verstanden. Ich möchte in einem file ' durch \' ersetzen. So Sachen wie sed 's/\'/\\\'/' gehen aber iregndwie überhaupt nicht. Weiß einer rat.
$ set -x $ echo "a'b'c" | sed "s/'/\\\'/g" + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ echo "a'b'c" | sed 's/'\''/\\'\''/g' + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ echo "a'b'c" | sed 's/'"'"'/\\'"'"'/g' + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ set +x Das Interessante ist dabei, dass sed in beiden Faellen das gleiche zu sehen bekommt :) Der 3-fach "\" in der Ersetzung der ersten Variante ist noetig, weil die shell in den "" schon einen Backslash wegnimmt... Achso: mit awk und perl bekommst man's auch nicht "schoener" hin. $ echo "a'b'c" | awk "{gsub(\"'\", \"\\\'\"); print;}" $ echo "a'b'c" | perl -pe "s/'/\\\'/g;" Aber vielleicht verraetst du uns ja noch, wozu und in welchem Zusammenhang du das ganze ueberhaupt brauchst, vielleicht laesst sich das Problem sowieso eleganter loesen (z.B. dadurch, dass du im shell-script anstaendig quotest *scnr*). -dnh PS: "der Trick" der letzteren beiden Varianten, ist, die '' Umgebung des sed-Argumentes aufzuheben, das ' (als \' in der zweiten, oder als "'" in der dritten Variante vor der shell maskiert) einzugeben und dann die '' Umgebung fuer's sed-Argument fortzusetzen. -- Einst gab Gott den Menschen 11 Gebote, leider ist beim zweiten Stein ein Stück abgebrochen, so dass nur noch 10 überliefert sind. Das elfte lautet: "Du sollst nicht als root arbeiten, schon gar nicht in einer grafischen Oberfläche!". -- Manfred Tremmel in suse-linux
Hi On Thursday 09 October 2003 13:01, David Haller wrote:
$ set -x $ echo "a'b'c" | sed "s/'/\\\'/g" + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ echo "a'b'c" | sed 's/'\''/\\'\''/g' + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ echo "a'b'c" | sed 's/'"'"'/\\'"'"'/g' + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ set +x
Das Interessante ist dabei, dass sed in beiden Faellen das gleiche zu sehen bekommt :)
Äähm... Was für zwei Fälle? Ich habe schon einen Verdacht was du meinst und ich bedanke mich schonmal für die Mühe, aber mein Hirn ist nicht in der Lage obige Zeilen in eindeutigen Zusammenhang mit _zwei Fällen_ zu bringen, sorry. Immerhin habe ich jetzt schonmal was über "set" gelernt (und die mail von Andreas wird auch etwas klarer). Es funktioniert jetzt auch und ich glaube die sed-Aufrufe verstanden zu haben.
Der 3-fach "\" in der Ersetzung der ersten Variante ist noetig, weil die shell in den "" schon einen Backslash wegnimmt...
Den hatte ich sogar ganz zu Anfang, nur waren die Anführungszeichen bei mir falsch.
Achso: mit awk und perl bekommst man's auch nicht "schoener" hin.
$ echo "a'b'c" | awk "{gsub(\"'\", \"\\\'\"); print;}" $ echo "a'b'c" | perl -pe "s/'/\\\'/g;"
Von der Lesbarkeit kommt mir das alles relativ krank vor.
Aber vielleicht verraetst du uns ja noch, wozu und in welchem Zusammenhang du das ganze ueberhaupt brauchst, vielleicht laesst sich das Problem sowieso eleganter loesen (z.B. dadurch, dass du im shell-script anstaendig quotest *scnr*).
Obige Lösungen sind schon eine sehr gut. Der Hintergrund ist folgender. Ich möchte ein iso-image von Dateien mit kranken Namen erzeugen (siehe mail bezüglich der -graft-points option). Dazu habe ich erstmal die Ausgabe von ls in ein skript kopiert und den Zielpfad diesen Zeilen vorangestellt. Die filenamen in diesem Skript sollen erstmal so escapet (dritte Person singular von "escapen") werden, dass das der mkisofs-Aufruf grundsätzlich funktioiert. Der Umweg über das Skript dient dazu noch Änderungen an den Zielnamen oder Pfaden vornehmen zu können. Und das ' ist eines der häufigsten und zusätzlich noch das widerspenstigste Zeichen in den Dateinamen.
PS: "der Trick" der letzteren beiden Varianten, ist, die '' Umgebung des sed-Argumentes aufzuheben, das ' (als \' in der zweiten, oder als "'" in der dritten Variante vor der shell maskiert) einzugeben und dann die '' Umgebung fuer's sed-Argument fortzusetzen.
Da muss man erstmal drauf kommen. mfg Axel
Hallo, Am Thu, 09 Oct 2003, Axel Heinrici schrieb:
On Thursday 09 October 2003 13:01, David Haller wrote:
$ set -x $ echo "a'b'c" | sed "s/'/\\\'/g" + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ echo "a'b'c" | sed 's/'\''/\\'\''/g' + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ echo "a'b'c" | sed 's/'"'"'/\\'"'"'/g' + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ set +x
Das Interessante ist dabei, dass sed in beiden Faellen das gleiche zu sehen bekommt :)
Äähm... Was für zwei Fälle?
Ääähhhm, sorry, das "beiden" war noch vom Stand der Mail, als die dritte Variante noch fehlte... Muesste also heissen (da sed auch im dritten Fall das gleiche zu sehen bekommt): "in allen drei Faellen"...
Ich habe schon einen Verdacht was du meinst und ich bedanke mich schonmal für die Mühe, aber mein Hirn ist nicht in der Lage obige Zeilen in eindeutigen Zusammenhang mit _zwei Fällen_ zu bringen, sorry.
Mein Fehler, s.o. Aber vergleiche die Zeilen, die mit '+ sed ' beginnen, das sind die, in denen die shell dann sed aufruft (und diesen Aufruf wg. 'set -x' eben protokolliert)... Intern in sed fallen dann aber nochmal alle "aeusseren" '' weg, d.h., das was sed schliesslich durchfuehrt ist jeweils: s/'/\\'/g (und dabei macht sed wieder aus dem \\ ein einzelnes '\')... Och, aye, man reiche mir nen Whisky... [1] Das mit dem quoten ist komplex ;) Aber dafuer hast du ja "uns" :) Ich glaub, ich muss hier mal ein "Seminar" ueber's quoten abhalten ;)
Immerhin habe ich jetzt schonmal was über "set" gelernt (und die mail von Andreas wird auch etwas klarer). Es funktioniert jetzt auch und ich glaube die sed-Aufrufe verstanden zu haben.
*g*
Der 3-fach "\" in der Ersetzung der ersten Variante ist noetig, weil die shell in den "" schon einen Backslash wegnimmt...
Den hatte ich sogar ganz zu Anfang, nur waren die Anführungszeichen bei mir falsch.
*eg*
Achso: mit awk und perl bekommst man's auch nicht "schoener" hin.
$ echo "a'b'c" | awk "{gsub(\"'\", \"\\\'\"); print;}" $ echo "a'b'c" | perl -pe "s/'/\\\'/g;"
Von der Lesbarkeit kommt mir das alles relativ krank vor.
Naja, geht halt net anders (auf der Kommandozeile). In scripten (awk/sed/perl) geht das dann schon wieder um mind. eine Stufe einfacher. $ cat ./test_escapes.sed #! /usr/bin/sed -f s/'/\\'/g $ echo "a'b'c" | sed -f ./test_escapes.sed a\'b\'c Wie man sieht, muss man sich im sed script (das sich ausfuehrbar gemacht auch direkt aufrufen laesst: 'echo "..." | ./test_escapes.sed'), nicht mit den ganzen escapes / dem quoten rumschlagen...
Aber vielleicht verraetst du uns ja noch, wozu und in welchem Zusammenhang du das ganze ueberhaupt brauchst, vielleicht laesst sich das Problem sowieso eleganter loesen (z.B. dadurch, dass du im shell-script anstaendig quotest *scnr*).
Obige Lösungen sind schon eine sehr gut. Der Hintergrund ist folgender. Ich möchte ein iso-image von Dateien mit kranken Namen erzeugen (siehe mail bezüglich der -graft-points option).
Schwierig -- v.a. weil ISO-9660 die Dateinamen eh aendert.
Dazu habe ich erstmal die Ausgabe von ls in ein skript kopiert und den Zielpfad diesen Zeilen vorangestellt. Die filenamen in diesem Skript sollen erstmal so escapet (dritte Person singular von "escapen") werden, dass das der mkisofs-Aufruf grundsätzlich funktioiert.
Da sollte man den Umweg weglassen... Und die Ausgabe von ls (-b), oder besser find, direkt an mkisofs pipen... Dazu bin ich jetzt aber zu muede.
Der Umweg über das Skript dient dazu noch Änderungen an den Zielnamen oder Pfaden vornehmen zu können. Und das ' ist eines der häufigsten und zusätzlich noch das widerspenstigste Zeichen in den Dateinamen.
Da bietet sich, wie oben angedeutet, der weg ueber ein sed-script an.
PS: "der Trick" der letzteren beiden Varianten, ist, die '' Umgebung des sed-Argumentes aufzuheben, das ' (als \' in der zweiten, oder als "'" in der dritten Variante vor der shell maskiert) einzugeben und dann die '' Umgebung fuer's sed-Argument fortzusetzen.
Da muss man erstmal drauf kommen.
*hehe* -dnh [1] ich bin seit gestern abend wach... -- Our lives are about development, mutation and the possibility of change; that is almost a definition of what life is: change. -- "Look to Windward", Iain M. Banks
Morgen On Thursday 09 October 2003 16:25, David Haller wrote:
Och, aye, man reiche mir nen Whisky... [1]
| | | highland | | single | | malt | | | +------------+ | | +------------+ Dann eben zum zweiten Frühstück :-)
Das mit dem quoten ist komplex ;) Aber dafuer hast du ja "uns" :)
Ich glaub, ich muss hier mal ein "Seminar" ueber's quoten abhalten ;)
Wenn man sich mal anschaut wie oft hier solche Fragen auftauchen dürfte das schon fast für ne eigenen "quotes und shell-escapes"-Liste reichen.
Naja, geht halt net anders (auf der Kommandozeile). In scripten (awk/sed/perl) geht das dann schon wieder um mind. eine Stufe einfacher.
$ cat ./test_escapes.sed #! /usr/bin/sed -f s/'/\\'/g $ echo "a'b'c" | sed -f ./test_escapes.sed a\'b\'c
Wie man sieht, muss man sich im sed script (das sich ausfuehrbar gemacht auch direkt aufrufen laesst: 'echo "..." | ./test_escapes.sed'), nicht mit den ganzen escapes / dem quoten rumschlagen...
Das ist ja sehr viel einfacher!
Obige Lösungen sind schon eine sehr gut. Der Hintergrund ist folgender. Ich möchte ein iso-image von Dateien mit kranken Namen erzeugen (siehe mail bezüglich der -graft-points option).
Schwierig -- v.a. weil ISO-9660 die Dateinamen eh aendert.
Dafür gibt es ja die Joliet und rockridge Sachen. Die Dateien kommen wieder "vernünftig" raus (sollen auch auf ner windose angezeigt werden).
Dazu habe ich erstmal die Ausgabe von ls in ein skript kopiert und den Zielpfad diesen Zeilen vorangestellt. Die filenamen in diesem Skript sollen erstmal so escapet (dritte Person singular von "escapen") werden, dass das der mkisofs-Aufruf grundsätzlich funktioiert.
Da sollte man den Umweg weglassen... Und die Ausgabe von ls (-b), oder besser find, direkt an mkisofs pipen... Dazu bin ich jetzt aber zu muede.
Spar dir die Mühe. Der Umweg über Skript und emacs muss leider sein. Ich will nicht alle Dateien haben und manche müssen in ein gesondertes Verzeichnis etc.... Bis ich das so an mkisofs gepipet kriege, wie ich will, habe ich das schon fünfmal von Hand gemacht. Habe gerade nachgelesen, daß es ja auch noch die ls-Option --quoting-style=shell gibt. mfg Axel P.S. einige Schotten sind der Meinung, daß man 100 Jahre alt wird, wenn man jeden morgen zwei Finger single malt und gebratenen Speck mit Eiern frühstückt.
Hallo, Am Fri, 10 Oct 2003, Axel Heinrici schrieb:
On Thursday 09 October 2003 16:25, David Haller wrote:
Och, aye, man reiche mir nen Whisky... [1]
| | | highland | | single | | malt | | | +------------+ | | +------------+
Dann eben zum zweiten Frühstück :-)
*g* Danke!
Das mit dem quoten ist komplex ;) Aber dafuer hast du ja "uns" :)
Ich glaub, ich muss hier mal ein "Seminar" ueber's quoten abhalten ;)
Wenn man sich mal anschaut wie oft hier solche Fragen auftauchen dürfte das schon fast für ne eigenen "quotes und shell-escapes"-Liste reichen.
Ist doch schoen, sonst ginge es hier nur um Hardware (v.a. nvidia) und samba etc. das waere langweilig.
Naja, geht halt net anders (auf der Kommandozeile). In scripten (awk/sed/perl) geht das dann schon wieder um mind. eine Stufe einfacher.
$ cat ./test_escapes.sed #! /usr/bin/sed -f s/'/\\'/g $ echo "a'b'c" | sed -f ./test_escapes.sed a\'b\'c
Wie man sieht, muss man sich im sed script (das sich ausfuehrbar gemacht auch direkt aufrufen laesst: 'echo "..." | ./test_escapes.sed'), nicht mit den ganzen escapes / dem quoten rumschlagen...
Das ist ja sehr viel einfacher!
Jep. V.a. wenn man mehr als einen sed-Befehl verwenden will lohnt sich sowas.
Obige Lösungen sind schon eine sehr gut. Der Hintergrund ist folgender. Ich möchte ein iso-image von Dateien mit kranken Namen erzeugen (siehe mail bezüglich der -graft-points option).
Schwierig -- v.a. weil ISO-9660 die Dateinamen eh aendert.
Dafür gibt es ja die Joliet und rockridge Sachen. Die Dateien kommen wieder "vernünftig" raus (sollen auch auf ner windose angezeigt werden).
Ok. [..]
Da sollte man den Umweg weglassen... Und die Ausgabe von ls (-b), oder besser find, direkt an mkisofs pipen... Dazu bin ich jetzt aber zu muede.
Spar dir die Mühe. Der Umweg über Skript und emacs muss leider sein. Ich will nicht alle Dateien haben und manche müssen in ein gesondertes Verzeichnis etc.... Bis ich das so an mkisofs gepipet kriege, wie ich will, habe ich das schon fünfmal von Hand gemacht.
*g* Du kannst vieles sicher per script z.B. sed / awk etc. "vorbearbeiten" und dann in emacs noch mit replace-regexp arbeiten... Das sollte dann ein vertretbarer Aufwand sein.
Habe gerade nachgelesen, daß es ja auch noch die ls-Option --quoting-style=shell gibt.
Jep :)
P.S. einige Schotten sind der Meinung, daß man 100 Jahre alt wird, wenn man jeden morgen zwei Finger single malt und gebratenen Speck mit Eiern frühstückt.
"wenn man 100 Jahre lang jeden morgen ... " ;) -dnh -- Das Leben ist ein Rollenspiel, in dem man den Endgegner niemals besiegen kann. [WoKo in dag°]
Hallo Axel, * Axel Heinrici schrieb am 09.Okt.2003:
On Thursday 09 October 2003 13:01, David Haller wrote:
$ set -x $ echo "a'b'c" | sed "s/'/\\\'/g" + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ echo "a'b'c" | sed 's/'\''/\\'\''/g' + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ echo "a'b'c" | sed 's/'"'"'/\\'"'"'/g' + echo 'a'\''b'\''c' + sed 's/'\''/\\'\''/g' a\'b\'c $ set +x
Das Interessante ist dabei, dass sed in beiden Faellen das gleiche zu sehen bekommt :)
Äähm... Was für zwei Fälle? Ich habe schon einen Verdacht was du meinst und ich bedanke mich schonmal für die Mühe, aber mein Hirn ist nicht in der Lage obige Zeilen in eindeutigen Zusammenhang mit _zwei Fällen_ zu bringen, sorry. Immerhin habe ich jetzt schonmal was über "set" gelernt (und die mail von Andreas wird auch etwas klarer). Es funktioniert jetzt auch und ich glaube die sed-Aufrufe verstanden zu haben.
Ohne näher auf obiges Beispiel einzugehen, *g* möchte ich darauf hinweisen, daß es wichtig ist, zu verstehen, was sed macht, und was die shell. Nur so hast Du eine Chance sed zu verstehen. set z.B hat mit sed rein gar nichts zu tun. \ hat sowohl in der shell als auch bei sed eine besondere Bedeutung, nämlich das Maskieren, des unmittelbar folgenden Zeichens, ' und " haben nur in der shell eine besondere Bedeutung. In sed, so sie da noch ankommen, sind es Zeichen wie alle anderen auch. Bernd
Hallo Axel, hallo Leute, Am Donnerstag, 9. Oktober 2003 14:33 schrieb Axel Heinrici: [ ' in Dateinamen per sed quoten]
Ich möchte ein iso-image von Dateien mit kranken Namen erzeugen (siehe mail bezüglich der -graft-points option). Dazu habe ich erstmal die Ausgabe von ls in ein skript kopiert [...]
Und warum nimmst Du nicht einfach ls --quote-name ? *g* Aber Achtung: alles quotet das scheinbar auch nicht, so werden z. B. Backticks in Dateinamen nicht gequotet (Bug in ls?) (was bei einfachen Anführungszeichen wiederum problemlos ist, da die Backticks dann nicht ausgewertet werden). Manchmal wünsche ich mir, Dateinamen dürften nur die Zeichen [-_a-z0-9] enthalten... Die Holzhammermethode wäre: Erstellung der Dateiliste in Perl und quoten per quotemeta. Das quotet wirklich alles, was sich nicht wehrt ;-) Allerdings ist die Dateiliste hinterher nicht sonderlich gut lesbar vor lauter Backslashes. Ach so: Falls Du Dich für diese Methode entscheiden solltest, _keine_ Anführungszeichen um das quotemeta-Ergebnis setzen! Gruß Christian Boltz --
Ich nehme also das apache.spm von SuSE und ...befördere es in einen Mülleimer. Dann gehe ich auf www.apachetoolbox.com und mache mir das Leben leicht. [> Soeren Mindorf und Ratti in suse-linux]
participants (6)
-
Andreas Kyek
-
Axel Heinrici
-
B.Brodesser@t-online.de
-
Christian Boltz
-
David Haller
-
Peter Wiersig