Substituindo todos os números pelo formato de moeda em determinada linha de texto
-
20-09-2019 - |
Pergunta
Quero escrever um programa Shell (AWK, SED também Fine) para receber como entrada uma única linha de texto.
Que terão arbitrariamente espalhar cordas inteiras nela. por exemplo
"12884 e 111933 são dois números e 323232 também é um número"
Eu quero que a saída seja
"12.884 e 1,11.933 são dois números e 2,23.232 também é um número"
Se esse fosse PHP, um simples preg_replace_callback teria servido a propósito, mas eu quero que isso esteja no shell. :/
Quaisquer indicadores de grande ajuda.
Solução
Não é necessário dividir a linha usando tr
. Você pode usar o recurso de divisão de palavras de Bash:
line="12884 and 111933 are two numbers and 323232 is also a number"
for word in $line
do
if [[ $word = *[^0-9]* ]]
then
printf "%s " $word
else
printf "%'d " $word
fi
done
Também usei o Globbing para testar uma sequência de dígitos, em vez de confiar em algo que cria um erro ou não, dependendo se é um número inteiro.
Outras dicas
for line in $(echo "12884 and 111933 are two numbers and 323232 is also a number"
| tr ' ' '\n');
do
if [ $line -eq $line 2> /dev/null ];
then printf "%'d\n" $line;
else
echo $line;
fi;
done | tr '\n' ' '
Eu entendo que isso pode ser longo e feio, mas agora é o melhor que eu poderia fazer, espero que ajude.
Segue a explicação:
- Punho, dividi a linha em mais linhas para que eu possa fazer um loop e reconhecer quais cordas são numerosas e quais não são
- Então eu testo se a string atual é um número
- Se for um número, analisarei o uso do printf
- Se não for, eu simplesmente ecoando, saindo como foi
- Termine o loop e coloque tudo de volta em uma linha