Kurz gesagt, printf %100s
druckt 100 Leerzeichen und tr " " "="
konvertiert diese Leerzeichen in Gleichheitszeichen, wodurch effektiv 100 Gleichheitszeichen gedruckt werden.
Brechen sie ab:
printf
ist eine eingebaute Shell. Normalerweise werden zwei oder mehr Argumente benötigt, von denen das erste eine "Formatzeichenfolge" ist und der Rest verwendet wird, um Platzhalter in dieser Formatzeichenfolge auszufüllen. Sobald diese Vorlage vollständig ausgefüllt ist, wird das Ergebnis ausgedruckt. Wenn noch mehr Argumente übrig sind, wird von vorne begonnen, mehr Argumente aufgefüllt und die resultierende Zeichenfolge gedruckt.
Die für verwendete Formatzeichenfolge printf
nimmt Formatspezifikationen an, die %
mit einem einzelnen Buchstaben beginnen und enden. Dies %d
bedeutet eine Ganzzahl (unter Verwendung der Dezimalbasis, daher "d"), %f
eine Gleitkommazahl und %s
eine Zeichenfolge. Andere Zeichen als Buchstaben nach %
sind Modifikatoren für die Formatspezifikation und insbesondere Zahlen, um die angeforderte Länge des Feldes bei der Ausgabe anzugeben. So %100s
wird die String - Format mindestens 100 Zeichen zu haben, wird es Pad es mit Leerzeichen und es wird halten sie rechts ausgerichtet (in anderen Worten, fügen Sie Leerzeichen am Anfang des Strings.)
Wenn ein zusätzliches Argument übergeben wird, wird es für dieses %s
Feld verwendet, sodass beispielsweise printf %100s abc
97 Leerzeichen gedruckt werden (um insgesamt 100 zu erhalten, unter Berücksichtigung der 3 in "abc"), gefolgt von der tatsächlichen Zeichenfolge "abc". Wenn jedoch kein Argument angegeben wird, wird die Formatspezifikation mit einem leeren oder Null-Argument gefüllt (was eine leere Zeichenfolge ist, für %s
die es 0 wäre %d
usw.). Das ist also dasselbe, als ob eine leere Zeichenfolge übergeben wurde, wie z printf %100s ''
. Das Endergebnis ist, dass nur die 100-Zeichen-Auffüllung gedruckt wird.
Wenn Sie also alles zusammenfügen, werden printf %100s
100 Leerzeichen gedruckt.
Jetzt tr
ist ein Werkzeug zum Übersetzen von Zeichen von Eingabe zu Ausgabe. Es werden zwei Argumente verwendet, SET1 und SET2, jeweils ein Satz von Zeichen, und dann wird das erste Zeichen von SET1 in das erste von SET2, das zweite Zeichen von SET1 in das zweite von SET2 usw. übersetzt. tr
Liest seine Eingabe von stdin und schreibt sie zurück in stdout (daher ist sie in Pipelines wie der obigen sehr nützlich.) tr
übersetzt immer alle Vorkommen dieses Zeichens in eine bestimmte Zeichenfolge.
Zum Beispiel tr aeiou 12345
werden Kleinbuchstaben in dieser Reihenfolge in die Zahlen 1 bis 5 übersetzt, sodass beispielsweise "Warteschlangen" in "q52523ng" übersetzt werden. Sie können ihm auch Zeichenbereiche übergeben, z. B. tr a-z A-Z
um einen Kleinbuchstaben in den entsprechenden Großbuchstaben umzuwandeln.
tr " " "="
Übersetzen Sie also einfach Leerzeichen in Gleichheitszeichen in der gesamten Zeichenfolge. Das erste Leerzeichen muss in Anführungszeichen gesetzt werden, um als Argument erkannt zu werden. Die =
nicht wirklich brauchen , um zitiert werden, aber dadurch nicht so nicht schaden. tr " " =
hätte genauso funktioniert.
Wenn Sie alles zusammenfügen, drucken Sie 100 Leerzeichen und übersetzen Sie jedes in Gleichheitszeichen.
Hoffentlich erklärt dies dies ausführlich genug, aber wenn Sie noch etwas nicht verstehen, hinterlassen Sie bitte einen Kommentar, und ich werde versuchen, dies zu beheben.
printf '%100s' ' ' | tr " " "="
printf '%100s' ''
mit einer leeren Zeichenfolge ... Ich habe die Antwort aktualisiert, um das einzuschließen . In diesem speziellen Fall würde eine leere Zeichenfolge oder ein einzelnes Leerzeichen keinen Unterschied machen, aber Sie können einen Unterschied in sehenprintf '%sx\n'
, der derselbe ist, sichprintf '%sx\n' ''
jedoch von dem unterscheidetprintf '%sx\n' ' '
. Ich hoffe das hilft!tr
die auf Zeichensätzen arbeitet. Dies wird oft ausgelassen.Der
printf
Befehl verwendet sein erstes Argument als Format zum Drucken seiner nachfolgenden Argumente.printf %100s
druckt die mit 100 Zeichen Breite aufgefüllten Argumente mit Leerzeichen (links) aus. Es gibt kein Argument zum Formatieren, daher wird die leere Zeichenfolge einmal formatiert und es werden 100 Leerzeichen ausgegeben. Sie können sehen, dass:(20 ist das Hex für ein Leerzeichen;
*
bedeutet, dass die vorherige Zeile wiederholt wird)Die Formatzeichenfolgen verwenden ungefähr die C-
Xprintf
Bezeichner :%
, eine optionale Breite zum Anpassen des formatierten Werts und einen zu verwendenden Formattyp.s
ist die Zeichenfolgenformatierung, und Zeichenfolgen werden standardmäßig links mit Leerzeichen aufgefüllt. Es kann mehrere Formate oder andere wörtliche Teile geben:printf "a%10sb\n" hello
Drucketr
Ersetzt ausgewählte Zeichen in der Standardeingabe durch ausgewählte Ersetzungen und druckt das Ergebnis in die Standardausgabe.tr " " "="
hat ein einzelnes Zeichen, das ersetzt werden soll - ein Leerzeichen - und ein einzelnes Zeichen, durch das es ersetzt werden soll - ein Gleichheitszeichen. Es verwandelt somit jeden Raum in seiner Eingabe in einen=
und lässt den Rest unverändert. Sie können das auch versuchen:(Ich habe die "Hallo Welt" getippt)
Sie können mehrere Ersetzungen vornehmen:
tr abc def
Verwandelt a in d, b in e, c in f und lässt den Rest unverändert. Hier ist es nur ein einziger Charakter, daprintf
dies billig generiert werden konnte.Die Pipe
|
bewirkt, dass die Ausgabe des Befehls auf der linken Seiteprintf %100s
als Eingabe für den Befehl auf der rechten Seite verwendet wirdtr " " "="
. Das heißt, es werden hundert aufeinanderfolgende Leerzeichen vergebentr
, und jedes von ihnen wird durch ein=
neues ersetzt , wobei die neue Zeichenfolge ausgedruckt wird.quelle
printf '%100s' ' ' | tr " " "="