Em resumo, printf %100s
imprimirá 100 espaços e tr " " "="
os converterá em sinais de igual, efetivamente imprimindo 100 sinais de igual.
Dividindo:
printf
é um shell embutido. Normalmente, são necessários dois ou mais argumentos, o primeiro dos quais é uma "sequência de formato" e o restante será usado para preencher espaços reservados nessa sequência de formato. Quando esse modelo estiver totalmente preenchido, ele imprimirá o resultado. Se houver mais argumentos, ele será iniciado novamente, preenchendo mais argumentos e imprimindo a sequência resultante.
A string de formato usada para obter printf
especificações de formato, que começam %
e terminam com uma única letra, %d
significa um número inteiro (usando a base decimal, portanto "d"), %f
significa um número de ponto flutuante e %s
uma string de caracteres. Caracteres que não sejam letras após %
são modificadores para a especificação de formato e, em particular, números são usados para especificar o comprimento solicitado do campo na saída. Assim %100s
, formatará a string para ter pelo menos 100 caracteres, preenchê-la-á com espaços e mantê-la alinhada corretamente (em outras palavras, adicione espaços no início da string).
Se passado um argumento extra, ele seria usado para esse %s
campo, por exemplo printf %100s abc
, imprimirá 97 espaços (para chegar ao total de 100, considerando os 3 em "abc") seguidos pela sequência real "abc". Mas se nenhum argumento for fornecido, a especificação de formato será preenchida com um argumento vazio ou nulo (que é uma string vazia para %s
, seria 0 para %d
etc.). Isso é o mesmo que se uma string vazia fosse passada, como printf %100s ''
. O resultado final é que apenas o preenchimento de 100 caracteres é impresso.
Então, juntando tudo, printf %100s
resulta em 100 espaços impressos.
Agora tr
é uma ferramenta para converter caracteres da entrada para a saída. Ele usa dois argumentos, SET1 e SET2, cada um conjunto de caracteres e, em seguida, converte o primeiro caractere de SET1 no primeiro de SET2, o segundo caractere de SET1 no segundo de SET2 e assim por diante. tr
lê sua entrada de stdin e a grava de volta em stdout (por isso é muito útil em pipelines como o acima.) tr
sempre traduzirá todas as ocorrências desse caractere em uma determinada string.
Por exemplo, tr aeiou 12345
converterá vogais em minúsculas nos números de 1 a 5 nessa ordem, portanto converterá "enfileiramento" em "q52523ng", por exemplo. Você também pode passar intervalos de caracteres, como tr a-z A-Z
transformar qualquer letra minúscula na maiúscula correspondente.
Assim, tr " " "="
é simplesmente traduzir espaços em sinais de igual em toda a cadeia. O primeiro espaço precisa ser citado para ser reconhecido como um argumento. Na =
verdade, não precisa ser citado, mas isso não faz mal. tr " " =
teria funcionado da mesma maneira.
Juntando tudo, imprima 100 espaços e depois traduza cada um deles em sinais de igual.
Espero que isso explique com detalhes suficientes, mas se ainda houver algo que você não entende, deixe um comentário e tentarei abordar isso.
printf '%100s' ' ' | tr " " "="
printf '%100s' ''
, com uma string vazia ... Atualizei a resposta para incluir isso. Nesse caso em particular, uma string vazia ou um único espaço não faria diferença, mas você pode ver uma diferença emprintf '%sx\n'
, que é a mesma coisaprintf '%sx\n' ''
mas diferente deprintf '%sx\n' ' '
. Espero que ajude!tr
opera em conjuntos de caracteres. Isso geralmente é deixado de fora.O
printf
comando usa seu primeiro argumento como um formato para imprimir seus argumentos subsequentes.printf %100s
imprime seus argumentos preenchidos com 100 caracteres de largura, usando espaços (à esquerda). Como não há argumento fornecido para formatar, ele formata a sequência vazia uma vez e gera 100 espaços. Você pode ver isso:(20 é o hexágono para um espaço;
*
significa a linha anterior repetida)As seqüências de formato usam aproximadamente os
Xprintf
especificadores C :,%
uma largura opcional para ajustar o valor formatado e um tipo de formato a ser usado.s
é a formatação de strings, e as strings são preenchidas com espaços à esquerda por padrão. Pode haver vários formatos ou outras partes literais:printf "a%10sb\n" hello
impressõestr
substitui os caracteres selecionados em sua entrada padrão por substituições selecionadas e imprime o resultado em sua saída padrão.tr " " "="
possui um único caractere a ser substituído - um espaço - e um único caractere para substituí-lo por - um sinal de igual. Assim, transforma todo espaço em sua entrada em um=
e deixa o restante inalterado. Você pode tentar isso também:(Eu digitei o "olá mundo")
Você pode ter várias substituições:
tr abc def
transforma a em d, b em e, c em f e deixa o restante inalterado. Aqui está apenas um caractere, já que era isso queprintf
poderia gerar mais barato.O canal
|
faz com que a saída do comando à esquerda,printf %100s
seja usada como entrada para o comando à direitatr " " "="
,. Ou seja, cem espaços consecutivos são atribuídostr
e cada um deles é substituído por um=
, com a nova sequência impressa.fonte
printf '%100s' ' ' | tr " " "="