Hallo raffa,
Du verwendest ein Grundkonstrukt in der Art von
> cat in.txt | sed „{Befehl}“
Der hier geeignete {Befehl} ist „Suche-und-ersetze“ und wird von sed (und „regular expressions“ allgemein) mit dem Buchstaben „s“ abgekürzt.
> s/alt/neu/
ersetzt jedes (erste) „alt“ durch „neu“ in der Zeile.
Da Du den Slash „/“ in Deinem Suchtext hast, ist es hilfreicher, ein andere Zeichen zu verwenden; ich nehme dann oft den Unterstrich „_“:
> s_alt_neu_
tut genau das gleiche, ich aber viel bequemer, wenn man etwa
> s_km/h_Stundenkilometer_
ersetzen möchte.
Was Du noch brauchst ist die Möglichkeit, vorherige Suchergebnisse im „Ersetzen“-Teil wiederzuverwenden. Hierzu ist das „\1“ nützlich:
> s_Ich gehe nach (Berlin)_Otto ging nach \1_
Mit mehreren Orten wäre das natürlich sinnvoller, womit Du dann gleich eine Auswahl ("|") deiner „tag“, „file“ und „directory“ Struktur hast:
> s_…(tag|file|directory)…_…\1…_
Du möchtest nun alles VOR dem „tag“ und so weiter abtrennen; also suchst Du nach allen Zeilen (".*") von Zeilen-Anfang ("^") bis zu einem „/“ hinter dem dann „tag“, „file“ oder „directory“ steht:
> s_^.*/(tag|file|directory)_/\1_
Hinter den drei Schlüsselworten kommt noch ein Slash und dann (nur) Ziffern als zweites Suchfeld:
> s_^.*/(tag|file|directory)/([0-9]*)_/\1/\2_
Um den Rest der Zeile wieder verschwinden zu lassen nimmst Du das abschließende „/“ und jedes weitere Zeichen:
> s_^.*(tag|file|directory)/([0-9]*)/.*_/\1/\2/_
Im „Ersetzen“-Block stehen nur noch die beiden Suchergebnisse \1 und \2 sowie die trennenden „/“
Im Prinzip solltest Du von Zeilen-Anfang ("^") bsi Zeilenende ("$") suchen, aber meine Tests mit
> s_^.*(tag|file|directory)/([0-9]*)/.*$_/\1/\2/_
waren erfolglos.
Zuletzt gilt es noch eine Besonderheit zu beachten: Deine Shell (bash, csh, …) kann eventuell einige Zeien des SED-Befehls vorab (falsch) interpretieren, daher müssen sie mit einem vorangestellten „“ geschützt („escaped“) werden. Dies gilt bei mir (bash) für die Klammern und das Pipe:
> cat in.txt | sed „s_^.*(tag|file|directory)/([0-9]*)/.*_/\1/\2/_“
Viel Erfolg,
Martin