2014-02-28 100 views
32

我試圖用bash腳本替換/.//././/./././/。我設法爲sed創建正則表達式,但它不起作用。sed加號不起作用

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

當我試圖僅僅更換/./子它在sed \/\.\/用正則表達式的工作。 sed正則表達式是否需要更多的標誌來使用子字符串乘以+*

回答

40

使用-r選項,以使sed使用擴展的正則表達式:

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

這就是它!謝謝:)我會盡快接受這個答案;) – J33nn

+4

僅供參考 - 通過OSX和BSD上的'-E'啓用擴展正則表達式。感謝您指點我正確的方向(rtfm'延長')! – nevelis

2

兩件事情,使之簡單:

$ variable="something/./././" 
$ sed -r 's#(\./){1,}##' <<< "$variable" 
something/ 
  • 使用{1,}指示一個或多個模式。這不需要g
  • 使用不同delimiterers #在上述情況下,使其可讀
  • +是ERE,所以你需要啓用-E-r選擇使用它
1

你也可以做到這一點使用bash的內置參數替換。這並不需要sed,這並不在Mac上接受-r下OS X:

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

here的解釋和其他例子。

+5

是的,對於'mac'我們需要使用'-E'。 –

+1

@jaypal:或者安裝一個合適的GNU sed ;-) –

3

任何sed的:

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

+\{1,\}甚至不會在這種情況下是必需的,一個*會做很好,所以

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

應該足夠