
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.0000000000
o 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 sed
declaraçã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;