POSIXly:
sed ':1
s/^\(.*|\)\{0,1\}\([0-9.]*[0-9][0-9.]*\)-\(|.*\)\{0,1\}$/-/
t1'
Ou com awk
de uma forma mais intuitiva:
awk -F '|' -v 'OFS=|' '{
for (i = 1; i <= NF; i++)
if ($i ~ /^[0-9]*(\.[0-9]+)?-$/)
$i = "-" substr($i, 1, length($i)-1)
print}'
(essa versão é mais estrita no que considera ser um número , o sed
aceitaria 1...2
como um número por exemplo).
Na sua entrada, isso dá:
-123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05