[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: sed: nach "../.." suchen



Hallo Jan.

On Fri, May 30, 2003 at 12:22:28AM +0200, Jan Schulz wrote:
> Wie bekomme ich sed dazu, aus 
> 
> classpath=/../../../../../usr/share/[file];/../../../../../usr/share/[file];[..]
> classpath=/usr/share/[file];/usr/share/[file];[..]
> 
> zu machen?

Versuch's mal mit

    sed 's:/\.\.::g'

oder wenn Du '/' als Trennzeichen fuer sed behalten willst (was
nicht unbedingt notwendig ist) mit "\/":

    sed 's/\/\.\.//g'

$ echo 'classpath=/../../../../../usr/share/[file];' | sed 's:/\.\.::g'
classpath=/usr/share/[file];

Wenn Du die Punkte nicht maskierst, dann steht der Punkt fuer ein
beliebiges Zeichen. Das geht dann schief. Den "/" musst Du nur
maskieren, wenn Du / als Trennzeichen fuer sed verwenden willst.

> Und falls jemand gerade dabei ist: wie bekomme ich es hin, das alle 
> /../../../../../usr/share/eclipse/plugins/<subdir>/bin; auch 
> rausfallen?

Das kannst Du durch nichts ersetzen lassen:

    sed 's:/\.\.::g; s:/usr/share/eclipse/plugins/[a-z]*/bin;::'
         ~~~ A ~~~~  ~~~ B ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Das ersetzt (A) zuerst "../" wie oben und (B) das andere. <subdir>
besteht dabei aus "[a-z]*", also keinem oder mehreren Kleinbuchstaben.
Wenn <subdir> Klein-, Grossbuchstaben und Zahlen enthalten kann, dann
kannst Du da "[0-9A-Za-z]*" oder "[[:alnum:]]*" nehmen.

$ echo 'foo/../../../../../usr/share/eclipse/plugins/subdir/bin;bar' | \
  sed 's:/\.\.::g; s:/usr/share/eclipse/plugins/[a-z]*/bin;::'

ergibt "foobar".

P.S.: Das schoene an sowas ist, dass es mindestens mehrere
Moeglichkeiten gibt, das zu loesen ;-).

Tschuess,
  Sebastian



Reply to: