Formatear una variable de punto flotante en una declaración SED

Formatear una variable de punto flotante en una declaración SED

Como parte de una receta de archivo MAKE, quiero ajustar repetidamente algunas líneas en algún archivo de texto txt.in. En particular, quiero actualizar, entre otras cosas, la tercera línea que contiene simplemente dos números separados por un espacio. Deben tener el formato 0.00 0.00. Como tal, he incluido el siguiente código en mi archivo MAKE para probar si puedo hacer esto.

# Makefile to test for-loop
SHELL=/bin/zsh

for:
    for k in 1 2 3; do \
        let n="$$k*0.25"; \
        let m="$$n+0.25"; \
        sed -i "3s/.*/$$n $$m/" txt.in; \
    done

Esto produce 0.7500000000 1.0000000000como resultado final. Puede que haya formas más eficientes de hacer esto y me encantaría conocerlas, pero lo que realmente me gustaría saber es si hay una manera de obtener el formato correcto.

Respuesta1

Tubería la salida a través

sed 's/\([0-9]\{1,\}\.[0-9][0-9]\)[0-9]*\>/\1/g'

para obtener el formato deseado. Efectivamente, su sedestado de cuenta cambiará a:

sed -i "3s/.*/$$n $$m/" txt.in | sed -i 's/\([0-9]\{1,\}\.[0-9][0-9]\)[0-9]*\>/\1/g' txt.in; \

Respuesta2

También puedes usar printf. Esto le dará relleno cero para números enteros incluso si su shell no lo proporciona:

o="$(printf "%.2f\n" "$$m")"
p="$(printf "%.2f\n" "$$n")"
sed -i "3s/.*/$$o $$p/" txt.in;

información relacionada