2012-04-24 19 views
2

我試圖替換具有尾部減號的值並將其替換爲前導減號。我有這個正則表達式在SED中不起作用,儘管我不明白爲什麼。替換尾部減號與前導減號

echo '8.8-' | sed 's/(\d+(?:\.\d+)?)-/-\\1/' 

SED返回8.8-

我試圖在記事本++正則表達式幫助插件,它相匹配的8.8-並識別子匹配\ 1 8.8

回答

4

\d是Perlism。 Sed指的是較舊的,Perl之前的POSIX標準。你可能想要的是

echo '8.8-' | sed -r 's/([[:digit:]]+(\.[[:digit:]]+)?)-/-\1/' 

[[:digit:]]是POSIX的方式來寫Perl的\d

當然,你可以只寫[0-9],而不像別人指出的那樣。

順便提一句,你需要-r來使你的括號能夠隨你的喜好工作。

+0

感謝您的詳細解釋。 – Todd 2012-04-25 00:57:31

3

\d不匹配一個數字字符的表達在sed,[0-9]將盡管。

順便說一句,請包括你真的想要做什麼 - 你使用數字? Ints和小數?我可以從您的RegEx中推導出儘可能多的數據,但如果問題得到妥善解答,則不需要這麼做。

編輯

如果您使用GNU Linux上,最好使用字符類比傳統的範圍,因爲他們是更便攜:

echo '8.8-' | sed -r 's/([[:digit:]]+(\.[[:digit:]]+)?)-/-\1/' 

http://sed.sourceforge.net/sedfaq3.html

1
echo '8- 8.1- 81.2- 8.28- 82.28-' | sed -r 's/([0-9]+(.[0-9]+)?)-/-\1/g' 

結果於

-8 -8.1 -81.2 -8.28 -82.28 

桑達根本不明白\ d或\ d:

echo "456" | sed -r 's/\d/+/g' 
456