2012-04-24 20 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