PDA

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?

arthur
02-11-2003, 16:52
hier:

sed -e "s|[^:]//|/|g"

ersetzen nur wenn vor dem // kein : steht

gruss

Arthur

micha
02-11-2003, 16:53
Hi,

so sollte es gehn:



sed 's|[^:]//|/|g'


Gruß micha

Badsteve
02-11-2003, 16:55
ohne das ^ stimmts :)

Steve

micha
02-11-2003, 17:13
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?

arthur
02-11-2003, 17:38
nimm meins dass solte doch funktionieren,
kleiner aber feiner unterschied ' und " ;)

gruss
Arthur
nehm ich zurück ;)

fork
02-11-2003, 17:39
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

:)

micha
02-11-2003, 19:22
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?