Pure Bash, sem utilitários externos
Esta demonstração justifica totalmente, mas você pode simplesmente omitir a subtração do comprimento da segunda string se desejar linhas retas irregulares.
pad=$(printf '%0.1s' "-"{1..60})
padlength=40
string2='bbbbbbb'
for string1 in a aa aaaa aaaaaaaa
do
printf '%s' "$string1"
printf '%*.*s' 0 $((padlength - ${#string1} - ${#string2} )) "$pad"
printf '%s\n' "$string2"
string2=${string2:1}
done
Infelizmente, nessa técnica, o comprimento da corda da almofada deve ser codificado para ser maior do que a mais longa que você acha que vai precisar, mas o comprimento da almofada pode ser uma variável, conforme mostrado. No entanto, você pode substituir a primeira linha por estas três para poder usar uma variável para o comprimento do bloco:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Portanto, o pad ( padlimit
e padlength
) pode ser baseado na largura do terminal ( $COLUMNS
) ou calculado a partir do comprimento da string de dados mais longa.
Resultado:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Sem subtrair o comprimento da segunda string:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
A primeira linha pode ser equivalente (semelhante a sprintf
):
printf -v pad '%0.1s' "-"{1..60}
ou da mesma forma para a técnica mais dinâmica:
printf -v pad '%*s' "$padlimit"
Você pode imprimir tudo em uma linha, se preferir:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"
'%0.31s'
. A string (o argumento final) é truncada para o comprimento especificado após o ponto. O zero evita que qualquer preenchimento de espaço seja gerado. Assim, 31 hífens são produzidos.padlength
para selecionar o comprimento real para a saída.Pure Bash. Use o comprimento do valor de 'PROC_NAME' como deslocamento para a string fixa 'line':
Isto dá
fonte
PROC_NAME
tem espaços, a menos que já tenham escapado. Você obterá uma linha com dois tokens cada e depois [UP] para cada dois tokens separados por espaço em sua variável e, em seguida, uma única linha no final com seuline
texto menos o comprimento total de sua string de entrada. Portanto, tome cuidado, pois isso pode levar a bugs interessantes e potencialmente inseguros se feito em um script complexo. Caso contrário, curto e simples. :)Solução trivial (mas funcionando):
fonte
Acho que essa é a solução mais simples. Construções de shell puras, sem matemática embutida. Ele pega emprestado de respostas anteriores.
Apenas substrings e a metavariável $ {# ...}.
Produz
Produz
fonte
Não há como preencher com nada além de espaços usando
printf
. Você pode usarsed
:fonte
printf "%-50s@%s\n" ${PROC_NAME}@ [UP] | sed -e 's/ /-/g' -e 's/-@/ /' -e 's/@-/ /'
Explicação:
printf '\055%.0s' {1..40}
- Crie 40 traços(o traço é interpretado como uma opção, portanto, use o código ASCII de escape)
"$PROC_NAME ..."
- Concatene $ PROC_NAME e travessões| head -c 40
- Corte a string para os primeiros 40 caracteresfonte
printf 'x' {1..40}
isso apenas imprime uma únicax
hmmmx
sprintf -- "-%.0s" {1..40}
Este é ainda mais simples e não executa comandos externos.
fonte
Simples, mas funciona:
Exemplo de uso:
Saída para stdout:
fonte
usando
echo
apenasO anwser de @Dennis Williamson está funcionando muito bem, exceto que eu estava tentando fazer isso usando eco. Echo permite a saída de caracteres com uma determinada cor. Usar printf removeria essa coloração e imprimiria caracteres ilegíveis. Esta é a
echo
única alternativa:resultado:
é claro que você pode usar todas as variações propostas por @Dennis Williamson se quiser que a parte direita seja alinhada à esquerda ou à direita (substituindo
25 - ${#string1}
por25 - ${#string1} - ${#string2}
etc ...fonte
Aqui está mais um:
fonte
Se você está terminando os caracteres de preenchimento em algum número de coluna fixo, você pode preenchê-los
cut
com o comprimento:fonte
Console simples Span / Fill / Pad / Padding com escalonamento / redimensionamento automático Método e Exemplo.
Exemplo:
create-console-spanner "loading graphics module" "[success]"
Agora, aqui está um conjunto completo de terminais de caracteres coloridos que faz tudo em relação à impressão de uma string formatada em cores e estilos com uma chave inglesa.
Para imprimir uma cor , isso é bastante simples:
paint-format "&red;This is %s\n" red
E você pode querer ousar mais tarde:paint-format "&bold;%s!\n" WOW
A
-l
opção para apaint-format
função mede o texto para que você possa fazer operações de métricas de fonte do console.A
-v
opção para apaint-format
função funciona da mesma forma,printf
mas não pode ser fornecida com-l
Agora, para a abrangência !
paint-span "hello " . " &blue;world"
[observação: não adicionamos sequência de terminal de nova linha, mas o texto preenche o terminal, então a próxima linha parece ser apenas uma sequência de terminal de nova linha]e o resultado disso é:
hello ............................. world
fonte
Bash + seq para permitir a expansão do parâmetro
Semelhante à resposta de @Dennis Williamson, mas se
seq
estiver disponível, o comprimento da corda do bloco não precisa ser codificado. O código a seguir permite passar uma variável para o script como um parâmetro posicional:O código ASCII "2D" é usado em vez do caractere "-" para evitar que o shell o interprete como um sinalizador de comando. Outra opção é "3D" para usar "=".
Na ausência de qualquer padlength passado como um argumento, o código acima é padronizado para a largura de terminal padrão de 80 caracteres.
Para tirar proveito da variável bash shell
COLUMNS
(ou seja, a largura do terminal atual), a variável de ambiente precisa estar disponível para o script. Uma maneira é originar todas as variáveis de ambiente executando o script precedido por.
(comando "ponto"), assim:ou (melhor) passar explicitamente a
COLUMNS
variável ao executar, assim:fonte