2014-02-28 14 views
32

Ich versuche /./ oder /././ oder /./././ zu / Skript nur in bash zu ersetzen. Ich habe es geschafft, Regex für Sed zu erstellen, aber es funktioniert nicht.sed Pluszeichen funktionieren nicht

variable="something/./././" 
variable=$(echo $variable | sed "s/\/(\.\/)+/\//g") 
echo $variable # this should output "something/" 

Als ich versuchte nur /./ Teilzeichenfolge es mit Regex in sed \/\.\/ gearbeitet zu ersetzen. Benötigt sed regex mehr Flags, um die Multiplikation der Teilzeichenfolge mit + oder * zu verwenden?

Antwort

40

Verwenden -r Option, um sed erweitern regulären Ausdruck zu verwenden:

$ variable="something/./././" 
$ echo $variable | sed -r "s/\/(\.\/)+/\//g" 
something/ 
+0

ausreichen sollte, dass es! Danke :) Ich werde diese Antwort akzeptieren, sobald ich dazu in der Lage bin;) – J33nn

+4

FYI - Erweiterte reguläre Ausdrücke werden über '-E' auf OSX & BSD aktiviert. Danke, dass Sie mich in die richtige Richtung weisen (rtfm für "erweitert")! – nevelis

2

Zwei Dinge, die es einfach zu machen:

$ variable="something/./././" 
$ sed -r 's#(\./){1,}##' <<< "$variable" 
something/ 
  • Verwenden {1,} Muster ein oder mehr anzuzeigen. Sie werden g damit nicht benötigen.
  • Verwenden Sie unterschiedliche delimiterers # in obigen Fall, um es lesbar zu machen
  • + ERE ist so müssen Sie -E oder -r Option aktivieren, es zu benutzen
1

Sie können auch mit bash-internen Parameter Substitution tun dies . Dies erfordert nicht sed, die nicht -r auf einem Mac unter OS X akzeptiert:

variable="something/./././" 
a=${variable/\/*/}/     # Remove slash and everything after it, then re-apply slash afterwards 
echo $a 
something/ 

Siehe here zur Erklärung und andere Beispiele.

+5

Ja, für 'mac' müssen wir' -E' verwenden. –

+1

@jaypal: Oder installiere eine richtige GNU sed ;-) –

3

Alle sed:

sed 's|/\(\./\)\{1,\}|/|g' 

Aber ein + oder \{1,\} würde in diesem Fall nicht einmal erforderlich sein, ein * wäre schön tun, so

sed 's|/\(\./\)*|/|g'