
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 l
linken PolsterungParametererweiterungsflag. Sie können r
hier auch die leichte Polsterung verwenden).
Natürlich müssen Sie nicht verwenden printf
. Sie können hier auch print
oder verwenden, wodurch standardmäßig echo
ein hinzugefügt wird . ( kann oder in geschrieben werden , wenn jedoch keine Backslashs enthalten sind und nicht mit beginnen , kann dies zu / vereinfacht werden ).\n
printf '%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 m
Flag, 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.