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

2

Como parte de uma receita do makefile, quero ajustar repetidamente algumas linhas em algum arquivo de texto txt.in . Em particular, quero atualizar, entre outros, a terceira linha que contém simplesmente dois números separados por um espaço. Eles devem ser formatados como 0.00 0.00 . Por isso, 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 gera 0.7500000000 1.0000000000 como resultado final. Pode haver maneiras mais eficientes de fazer isso e ficarei feliz em saber sobre isso, mas o que eu realmente gostaria de descobrir é se há uma maneira de obter o formato correto.

    
por Wouter 24.06.2014 / 02:15

2 respostas

5

Canalize a saída por meio de

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

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

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

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

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