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