Wiederholen eines Zeichens mit printf und Anhängen einer neuen Zeile am Ende

Wiederholen eines Zeichens mit printf und Anhängen einer neuen Zeile am Ende

Um ein Zeichen N-mal zu wiederholen, könnten wir verwenden printf. Um es beispielsweise @20-mal zu wiederholen, könnten wir so etwas verwenden:

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

Ausgabe:

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

Am Ende dieser Zeichenfolge steht jedoch kein Zeilenumbruchzeichen. Ich habe versucht, die Ausgabe weiterzuleiten an sed:

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

Ist es möglich, dasselbe Ergebnis mit einer einzelnen Funktion printf(Hinzufügen eines Zeilenumbruchzeichens am Ende der Ausgabe) zu erzielen, ohne sed zu verwenden?

Antwort1

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

Die Shell erweitert zuerst die Klammern, dies wird als "Klammernerweiterung" bezeichnet.
@{1..20}in @1 @2 @3 ...und so weiter
Dann wird das erste Byte jedes Parameters ausgegeben, einschließlich des letzten Arguments, $'\n'das aus einem Byte besteht - dem Newline-Zeichen

Antwort2

Mit zsh:

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

(mithilfe der llinken PolsterungParametererweiterungsflag. Sie können rhier auch die leichte Polsterung verwenden).

Natürlich müssen Sie nicht verwenden printf. Sie können hier auch printoder verwenden, wodurch standardmäßig echoein hinzugefügt wird . ( kann oder in geschrieben werden , wenn jedoch keine Backslashs enthalten sind und nicht mit beginnen , kann dies zu / vereinfacht werden ).\nprintf '%s\n' "$string"print -r -- "$string"echo -E - "$string"zsh$string-print "$string"echo "$string"

Wenn das Endziel darin besteht, eine Liste von Zeichenfolgen anzuzeigen, die auf die Breite des Bildschirms aufgefüllt sind, würden Sie Folgendes tun:

$ 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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Dabei bewirkt das mFlag, dass zsh die Anzeigebreite jedes Zeichens berücksichtigt (wie bei den oben genannten doppelt breiten Zeichen (die Ihr Browser möglicherweise nicht mit genau doppelter Breite rendert, Ihr Terminal jedoch schon)).

print -rC1 --ist wie printf '%s\n'oder , print -rl --um ein Element pro Zeile zu drucken, außer in dem Fall, dass keine Argumente übergeben werden (wie wenn lines=()), in welchem ​​Fall nichts statt einer leeren Zeile gedruckt wird).

Antwort3

Ich verwende dies in einem Skript: printf '%150s\n' | tr ' ' '@'

Antwort4

Eine Lösung zum ursprünglichen Beitrag – von vor über einem Jahr:

Wiederholen eines Zeichens mit printf und Anhängen einer neuen Zeile am Ende

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

Nur für den Fall, dass jemand anderes das gleiche oder ein ähnliches Problem hat.

verwandte Informationen