Sed 用前导减号替换尾随减号

Sed 用前导减号替换尾随减号,sed,Sed,我试图替换尾随负号的值,并用前导负号替换它们。我有一个正则表达式,它在SED中不太有效,尽管我不明白为什么 echo '8.8-' | sed 's/(\d+(?:\.\d+)?)-/-\\1/' SED返回8.8- 我尝试了Notepad++RegEx帮助插件中的表达式,该表达式与8.8匹配,并将子匹配项\1标识为8.8\d与sed中的数字字符类不匹配,[0-9]仍将匹配 顺便说一句,请包括你真正想做的事情-你在用数字工作吗?整数和小数?我可以从你的正则表达式中推断出同样的结果,但如果问题问

我试图替换尾随负号的值,并用前导负号替换它们。我有一个正则表达式,它在SED中不太有效,尽管我不明白为什么

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


我尝试了Notepad++RegEx帮助插件中的表达式,该表达式与8.8匹配,并将子匹配项\1标识为8.8

\d
与sed中的数字字符类不匹配,
[0-9]
仍将匹配

顺便说一句,请包括你真正想做的事情-你在用数字工作吗?整数和小数?我可以从你的正则表达式中推断出同样的结果,但如果问题问得恰当的话,我不需要这样做

编辑

如果您使用的是GNU linux,最好使用字符类,而不是传统的范围,因为它们更便于移植:

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

导致

-8 -8.1 -81.2 -8.28 -82.28
Sed根本不理解\d或\d:

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

\d
是一种特殊的语言。Sed是指旧的、Perl之前的POSIX标准。你可能想要的是

echo '8.8-' | sed -r 's/([[:digit:]]+(\.[[:digit:]]+)?)-/-\1/'
[[:digit:]
是编写Perl的
\d
的POSIX方法

当然,您可以只编写
[0-9]
,正如其他人所指出的那样


顺便说一句,您需要
-r
使括号按您喜欢的方式工作。

感谢您的详细解释。
echo '8.8-' | sed -r 's/([[:digit:]]+(\.[[:digit:]]+)?)-/-\1/'