
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 l
preenchimento esquerdosinalizador de expansão de parâmetro. Você também pode usar o r
preenchimento correto aqui).
Claro, você não precisa usar printf
. Você também pode usar print
ou echo
aqui que adiciona um \n
por padrão. ( printf '%s\n' "$string"
pode ser escrito print -r -- "$string"
ou echo -E - "$string"
em zsh
, embora se $string
nã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 m
sinalizador 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.