Archiv verlassen und diese Seite im Standarddesign anzeigen : sed: Doppelslash rauswerfen, wenn links kein Doppelpunkt steht
axeljaeger
02-11-2003, 16:44
Ich hab ein kleines Problem mit sed:
Ich verwende sed, um doppelte Slashes aus Pfadnamen zu entfernen. Die Pfadnamen können auch URLs sein. Ich verwende dazu den Befehl:
sed "s|//|/|g" Das Problem ist jetzt, das am Anfang einer URL gewöhnlich eine Protokollangabe steht, die durch einen Doppelslash vom Pafd getrennt wird. Durch meine Search & Replace-Aktion wird diese Angabe natürlich unbrauchbar. Kann ich das sed eventuell so bändigen, dass nur ersetzt wird, wenn links vom Doppelslash kein Doppelpunkt steht?
hier:
sed -e "s|[^:]//|/|g"
ersetzen nur wenn vor dem // kein : steht
gruss
Arthur
Hi,
so sollte es gehn:
sed 's|[^:]//|/|g'
Gruß micha
Badsteve
02-11-2003, 16:55
ohne das ^ stimmts :)
Steve
Original geschrieben von Badsteve
ohne das ^ stimmts :)
Steve
Nein, allerdings stimmt meins auch nicht, da zwar nicht ersetzt wird, wenn davor ein Doppelpunkt steht, bei allen anderen aber während der Ersetzung ein Zeichen verloren geht.
Gruß micha
axeljaeger
02-11-2003, 17:17
oh, schon wieder eine Antwort. Das von micha ohne Dach funktioniert schonmal in dem einen Fall, aber ich hab das Gefühl, dadurch werden noch andere Sachen rausgeworfen, die eigentlich drinn bleiben sollten:
..//
wird zu
./
und das darf auf keine Fall passieren. Das ganze Skript, in dem das verbaut ist, erzeugt eine recht beachtliche Hierachie von relativen Pfadnamen, die kein Mensch so schreiben würde. Vielleicht gibt es ja in irgendeiner Programmiersprache, die ich in ein Bashscript einbinden kann, eine fertige Funktion oder so? Wie heist es denn jetzt richtig?
nimm meins dass solte doch funktionieren,
kleiner aber feiner unterschied ' und " ;)
gruss
Arthur
nehm ich zurück ;)
Ja bei den bisherigen Vorschlägen wird das linke Zeichen, das kein Doppelpunkt ist gelöscht, deswegen muss man sich das merken und im 2. Teil der Ersetzung mit dazu packen, das geht mit Klammern die noch vor der Shell geschützt werden müssen( mit "\" ). Die Referenzierung des Wertes geht dann mit \1, \2, ... \9
echo "http:// this//that" | sed -e 's=\([^:]\)//=\1/=g'
P. S.: Das Pipezeichen würde ich nicht unbedingt als Trenner verwenden, oder allgemein Metazeichen.
Es geht auch ohne diese "Variablen" mit sogenannten Zusicherungen. ^ ist z. B. eine wenn es als String-/Zeilenanfang verwendet wird und steht für ein Element der Länge null. Leider weiss ich nicht ob das sed unterstützt. Stichwörter: positives/negatives Lookahead/Lookbehind
axeljaeger
02-11-2003, 18:06
@arthur
also deins wie es da steht mit den doppelten Hochkommata?
Badsteve
02-11-2003, 18:22
@ micha
stimmt mein Fehler.
perl -pi~ -ne 's/(?<!:)\/\//\//ig;' datei
:)
Original geschrieben von fork
Ja bei den bisherigen Vorschlägen wird das linke Zeichen, das kein Doppelpunkt ist gelöscht, deswegen muss man sich das merken und im 2. Teil der Ersetzung mit dazu packen, das geht mit Klammern die noch vor der Shell geschützt werden müssen( mit "\" )
Mit Klammern gruppieren und mit \1 dazunehmen hatte ich gehabt, allerdings blieb das Ganze erfolglos, da ich die Klammern nicht geschützt hatte...
Wieder was dazugelernt, thx.
Gruß
micha
axeljaeger
04-11-2003, 16:27
Der Perllösung von Badsteve scheint ja angenommen worden zu sein, jedenfalls hat niemand wiedersprochen. Muss ich da noch was dran verändern, wenn ich die Daten über eine Pipe, und nicht als Dateinamen, reingeben will?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.