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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top