Formatando uma variável de ponto flutuante em uma instrução SED

Formatando uma variável de ponto flutuante em uma instrução SED

Como parte de uma receita makefile, quero ajustar repetidamente algumas linhas em algum arquivo de texto txt.in. Em particular, quero atualizar, entre outras coisas, a terceira linha que contém simplesmente dois números separados por um espaço. Eles devem ser formatados como 0.00 0.00. Como tal, incluí o código abaixo em meu makefile para testar se posso fazer isso.

# 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

Isso produz 0.7500000000 1.0000000000o resultado final. Pode haver maneiras mais eficientes de fazer isso e eu ficaria feliz em saber mais sobre elas, mas o que eu realmente gostaria de descobrir é se existe uma maneira de acertar o formato.

Responder1

Canalize a saída através

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

para obter o formato desejado. Efetivamente, sua seddeclaração mudará para:

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

Responder2

Você também pode usar printf. Isso fornecerá preenchimento zero para números inteiros, mesmo que seu shell não forneça isso:

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

informação relacionada