2012-10-29 40 views
7

我寫了以下sed一個班輪代替IP地址的第三部分。sed使用擴展正則表達式和捕獲組

sed 's/192\.168\.[0-9]*\.\([0-9]*\)/192.168.15.\1/g' 

192.168.0.1 
192.168.15.1 

我想用??其擴展正則表達式,使其懶惰所以它會與192.168.15取代192.168.0但是當我提供「-r」選項,我得到了下面的錯誤。

$ sed -r 's/192\.168\.[0-9]*\.\([0-9]*\)/192.168.15.\1/g' 
sed: -e expression #1, char 44: invalid reference \1 on `s' command's RHS 

你能解釋一下這裏發生了什麼,以及如何在使用捕獲組的時候表達懶惰?

注意:我可以用很多不同的方法來實現這個例子,我的問題不是如何解決這個例子。我很有趣地將sed與exteneded正則表達式和捕獲組一起使用。

+1

N.B. 'sed -r's/192 \ .168(\。[0-9] *){2} /192.168.15 \ 1/g''實現相同的結果,反向參考'\ 1'返回第二個兩個'(\。[0-9] *){2}'並且避免了正則表達式的重複。 – potong

+0

這是更清潔,也有助於表達懶惰'sed -r's/192 \ .168(\。?? [0-9] *){2} /192.168.15 \ 1/g''因爲它的交易對於3部分的情況,尾隨「。」。 –

回答

8

由於([0-9]*)是匹配符號組的有效語句,因此不需要使用大括號。

$> echo "192.168.0.1" | sed -r 's/192\.168\.[0-9]*\.([0-9]*)/192\.168\.15\.\1/g' 
192.168.15.1 
+0

請注意,如果您要替換文件,則使用-ir可能無效。如果是這樣的話,你需要單獨傳遞選項,如'sed -i -r'/.../.../file''(或者使用拼寫的版本:'sed --in-place --regexp-extended's /.../.../ file'')。 – waldyrious