repetindo um caractere usando printf e acrescentando uma nova linha no final

repetindo um caractere usando printf e acrescentando uma nova linha no final

Para repetir um caracter N vezes, poderíamos usar printf. Por exemplo, para repetir @20 vezes, poderíamos usar algo assim:

N=20
printf '@%.0s' $(seq 1 $N)

saída:

@@@@@@@@@@@@@@@@@@@@

No entanto, não há caractere de nova linha no final dessa string. Eu tentei canalizar a saída para sed:

printf '@%.0s' $(seq 1 $N) | sed '$s/$/\n/'

É possível obter o mesmo resultado com um único printf(adicionando um caractere de nova linha no final da saída) sem usar sed?

Responder1

printf %.1s @{1..20} $'\n'

o shell expande os colchetes primeiro, isso é chamado de "Expansão do Brace".
@{1..20}into @1 @2 @3 ...e assim por diante
Então o primeiro byte de cada parâmetro será exibido, incluindo o último argumento $'\n'que consiste em um byte - o caractere de nova linha

Responder2

Com zsh:

printf '%s\n' ${(l[20][@])}

(usando o lpreenchimento esquerdosinalizador de expansão de parâmetro. Você também pode usar o rpreenchimento correto aqui).

Claro, você não precisa usar printf. Você também pode usar printou echoaqui que adiciona um \npor padrão. ( printf '%s\n' "$string"pode ser escrito print -r -- "$string"ou echo -E - "$string"em zsh, embora se $stringnão contenha barras invertidas e não comece com -, isso pode ser simplificado para print "$string"/ echo "$string").

Se o objetivo final for exibir uma lista de strings preenchidas na largura da tela, você faria:

$ lines=(short 'longer text' 'even longer')
$ print -rC1 -- ${(ml[$COLUMNS][@][ ])lines}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ short
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ longer text
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ even longer
$ print -rC1 -- ${(mr[$COLUMNS][@][ ])lines}
short @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
longer text @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
even longer @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Onde o msinalizador faz com que o zsh leve em consideração a largura de exibição de cada caractere (como para os caracteres de largura dupla acima (que seu navegador pode não renderizar exatamente com largura dupla, mas seu terminal deveria)).

print -rC1 --é como printf '%s\n'ou print -rl --imprimir um elemento por linha, exceto no caso em que nenhum argumento é passado para ele (como quando lines=()), caso em que não imprime nada em vez de uma linha vazia).

Responder3

Eu uso isso em um script: printf '%150s\n' | tr ' ' '@'

Responder4

Uma solução para a postagem original - de mais de um ano atrás:

repetindo um caractere usando printf e acrescentando uma nova linha no final

printf '@%.0s' $(seq 1 $N); echo

Apenas no caso de outra pessoa ter o mesmo problema ou semelhante.

informação relacionada