A formatação de texto é um tópico interessante, especialmente quando se trata de bash. Embora existam muitas ferramentas para formatar texto, printf é único e universal. Aprenda tudo sobre printf no Bash para formatar seu texto da maneira certa!!
Usando printf na festa
C ++ e outros desenvolvedores já estarão familiarizados com o printf como uma ótima maneira de formatar a saída de texto ao programar. Ter a mesma ferramenta disponível no Bash é um grande benefício. printf permite que você controle e produza formatos de saída complexos, assim como você deseja. A página de manual do printf estabelece o printf como uma ferramenta de 'impressão e formatação de dados', que é exatamente o que é e faz.
Como um exemplo, Você gostaria de imprimir um número decimal com um comprimento exato de 3 bytes (o caracteres / números) para a parte inteira (a parte antes do ponto decimal ou vírgula, dependendo de onde você mora no mundo e qual é sua localidade) e 2 bytes (o caracteres / números) para a parte decimal do número? Não há problema, printf pode fazer isso e muito mais. Você também pode enviar o texto para uma coluna específica na tela, etc.
Mesmo que a sintaxe de printf, para um novo desenvolvedor, pode parecer confuso ou complexo, na verdade é bem simples. Há apenas um conjunto limitado de caracteres de formato de trabalho comum que podem ser usados em uma definição de saída de printf. Vamos dar uma olhada nisso primeiro..
Sintaxe: printf
Estes são os mais usados sintaxe printf expressões idiomáticas de formato de número:
%d or %i a signed decimal integer %u an unsigned decimal integer %f a decimal floating point number %e a scientific notation number %g will let printf use %e or %f, whichever is shorter %c a single character %s a string of characters %% a literal '%'
A seguir, es bueno saber cómo especificar opciones específicas en vinculación con estos modismos de formato. El formato para especificar opciones para estos es el siguiente:
%[bandeira(s)][width][.precision][length]number_formatting_idiom
Exemplos: printf
Então, como um exemplo, para tener un flotante con un ancho de 3 y una precisión de 2, debe especificar:
%3.2f
Vamos ver um exemplo:
printf "%3.2fn" "100.304"
Sencillo y sencillo. Tenga en cuenta que podríamos haber utilizado una variable en lugar de "100.304"
:
VAR1=100.304 printf "%3.2fn" ${VAR1}
Note además cómo agregamos una nueva línea usando un n
secuencia de nueva línea. Para obtener una lista completa de las secuencias interpretadas disponibles, consulte man printf
. Los mas comunes son n
para nueva línea, t
para pestaña y para una barra invertida.
En el formato de alternativas anterior además vimos cómo podemos especificar banderas. Hay una cantidad limitada de banderas comunes:
- Left-justify text (right-justify is the default) + Forces the use of a sign, even if positive ' ' A space is inserted if no sign will be used 0 Left-pad the number with zeroes instead of spaces when padding is specified
A) Sim, como um exemplo, podemos tener:
VAR1=-100.304 VAR2=100.304 printf "% 3.2ftt%+3.2fn" ${VAR1} ${VAR2}
Aqui, usamos duas variáveis e separamos a saída por duas guias usando dois t
sequências de tabs. Também inserimos um espaço (como uma bandeira) Entre %
e definição de largura. Isso levou ao número negativo em VAR1
imprimir com um sinal negativo. Se o número fosse positivo, nenhum sinal teria sido impresso e, em vez de, um espaço teria sido impresso na mesma posição.
Para finalizar usamos o +
bandeira e, na realidade, nosso número é emitido com um +
sinal, independentemente do fato de que o número já é positivo e, por isso, (regularmente) nenhum sinal será impresso.
Então, Como podemos ter certeza de que temos zeros ou espaços iniciais, enquanto ainda tem um comprimento específico? Primeiro, temos que nos certificar de que a largura de nossa definição é maior do que o conteúdo variável, e em segundo lugar, podemos usar o 0
sinalizar para mostrar zeros à esquerda:
VAR1=-100.304 VAR2=100.304 printf "% 13.2fn%013.2fn%13.2f" ${VAR1} ${VAR2} ${VAR1}
Neste exemplo, nós imprimimos 3 linhas, separados duas vezes pelo n
secuencia de nueva línea. Notamos imediatamente que se não houver uma nova linha no final da saída, nosso indicador Bash retorna especificamente para o final de nossa terceira linha de saída.
Este pode não ser um formato agradável ou útil no modo interativo no terminal, mas de dentro de um script (pensar, como um exemplo, em uma sequência como 1...2...3...
que é construído passo a passo na tela conforme você percorre o código) Isso pode ser muito útil.
Na segunda linha de partida, nós usamos o 0
sinalizador para indicar que gostaríamos de usar zeros à esquerda para VAR2
. Na realidade, a saída lança zeros à esquerda, até definir o comprimento.
Na primeira linha de partida, inserimos um espaço enquanto na terceira linha de saída (ambos imprimindo o VAR1
variável) nós não. O resultado é o mesmo, que é a única esquisitice que encontrei enquanto trabalhava printf
; seria de se esperar que houvesse um caractere adicional, dado o definição da bandeira do espaço printf. Isso permanece o mesmo, mesmo se usarmos zeros à esquerda. Ele também permanece o mesmo se o comprimento não for especificado.
Por tanto, a usabilidade do sinalizador de espaço pode ser limitada em alguns casos (números negativos). Este não é o caso de números positivos:
VAR1=100.304 printf "% fn%0fn" ${VAR1} ${VAR1}
Nesta circunstância (números positivos), a bandeira do espaço funciona como esperado, e um espaço extra é inserido no caso do primeiro VAR1
Produção.
conclusão
Usar printf de dentro de scripts bash ou na linha de comando pode produzir uma saída clara e bem estabelecida. Se você escalar as variáveis corretamente (e talvez o alcance, verifique-os com certeza), usando printf lhe dará um método flexível para formatar a saída (e o layout geral da tela para aplicativos maiores) como você escolhe.
Neste post, discutimos expressões idiomáticas de formato de número comumente usadas, como definir a largura da parte inteira e decimal dos números, e revisamos os sinalizadores mais usados no printf. Divirta-se imprimindo dados bem formatados com printf!