Короче говоря, printf %100s
напечатает 100 пробелов и tr " " "="
преобразует эти пробелы в знаки равенства, эффективно печатая 100 знаков равенства.
Разбивая это:
printf
это встроенная оболочка Обычно требуется два или более аргумента, первый из которых является «строкой формата», а остальные будут использоваться для заполнения заполнителей в этой строке формата. Как только этот шаблон будет полностью заполнен, он распечатает результат. Если осталось больше аргументов, он начнется заново, заполняя больше аргументов и печатая полученную строку.
Строка формата, используемая для, printf
принимает спецификации формата, которые начинаются %
и заканчиваются одной буквой, поэтому %d
означает целое число (с использованием десятичной основы, следовательно, «d»), %f
означает число с плавающей запятой и %s
означает строку символов. Символы, отличные от букв после, %
являются модификаторами для спецификации формата, и, в частности, цифры используются для указания запрошенной длины поля на выходе. Таким образом %100s
, строка будет иметь формат не менее 100 символов, заполнит ее пробелами и выровнит ее по правому краю (другими словами, добавит пробелы в начале строки).
Если передан дополнительный аргумент, он будет использовать его для этого %s
поля, поэтому, например printf %100s abc
, напечатает 97 пробелов (чтобы получить общее число 100, учитывая 3 в «abc»), за которыми следует фактическая строка «abc». Но если аргумент не указан, то спецификация формата заполняется пустым или нулевым аргументом (для которого пустая строка, для %s
0 будет 0 %d
и т. Д.). То же самое, как если бы была передана пустая строка, например: printf %100s ''
, Конечным результатом является то, что печатается только заполнение из 100 символов.
Таким образом, все это printf %100s
приводит к печати 100 пробелов.
Теперь tr
это инструмент для перевода символов из ввода в вывод. Он принимает два аргумента, SET1 и SET2, каждый набор символов, а затем переводит первый символ SET1 в первый из SET2, второй символ SET1 во второй из SET2 и так далее. tr
читает входные данные из stdin и записывает их обратно в stdout (так что это очень полезно в конвейерах, подобных приведенному выше.) tr
всегда переводит все вхождения этого символа в данную строку.
Например, tr aeiou 12345
будет переводить строчные гласные в числа от 1 до 5 в этом порядке, поэтому он будет переводить «очередь» в «q52523ng», например. Вы также можете передать ему диапазон символов, например, tr a-z A-Z
чтобы превратить любую строчную букву в соответствующую заглавную.
Так tr " " "="
же просто переводить пробелы в знаки равенства по всей строке. Первое место должно быть заключено в кавычки, чтобы быть признанным в качестве аргумента. На =
самом деле не нужно цитировать, но это не повредит. tr " " =
работал бы так же.
Собрав все воедино, выведите 100 пробелов, а затем переведите каждый из них в знаки равенства.
Надеюсь, это объясняет это достаточно подробно, но если есть что-то, чего вы не понимаете, пожалуйста, оставьте комментарий, и я постараюсь ответить на него.
printf '%100s' ' ' | tr " " "="
printf '%100s' ''
, с пустой строкой ... Я обновил ответ, чтобы включить это. В этом конкретном случае пустая строка или один пробел не будут иметь значения, но вы можете увидеть разницуprintf '%sx\n'
, которая такая же,printf '%sx\n' ''
но отличается отprintf '%sx\n' ' '
. Надеюсь, это поможет!tr
действует на наборы символов. Это часто не учитывается.Команда
printf
использует свой первый аргумент в качестве формата для печати своих последующих аргументов.printf %100s
распечатывает аргументы шириной до 100 символов, используя пробелы (слева). Для форматирования нет аргументов, поэтому он форматирует пустую строку один раз и выводит 100 пробелов. Ты это видишь:(20 - гекс для пробела;
*
означает повторение предыдущей строки)В строках формата приблизительно используются
Xprintf
спецификаторы C :%
необязательная ширина для соответствия форматированному значению и тип используемого формата.s
это форматирование строки, и строки дополняются пробелами слева по умолчанию. Может быть несколько форматов или другие буквенные части:printf "a%10sb\n" hello
печатные изданияtr
заменяет выбранные символы в своем стандартном вводе выбранными заменами и печатает результат в его стандартный вывод.tr " " "="
имеет один символ для замены - пробел - и один символ для замены - знак равенства. Таким образом, он превращает каждое пространство в своем входе в=
, и оставляет остальное без изменений. Вы также можете попробовать это:(Я напечатал "Привет, мир")
Вы могли бы иметь несколько замен:
tr abc def
превращает a в d, b в e, c в f, а остальное оставляет без изменений. Здесь это всего лишь один символ, так как это было то, чтоprintf
могло бы дешево генерировать.Канал
|
приводит к выводу команды слева,printf %100s
которая будет использоваться в качестве ввода для команды справаtr " " "="
,. Таким образом, дается сотня последовательных пробеловtr
, и каждый из них заменяется на=
, с новой распечатанной строкой.источник
printf '%100s' ' ' | tr " " "="