
Чтобы повторить символ N раз, мы могли бы использовать printf
. Например, чтобы повторить @
20 раз, мы могли бы использовать что-то вроде этого:
N=20
printf '@%.0s' $(seq 1 $N)
выход:
@@@@@@@@@@@@@@@@@@@@
Однако в конце этой строки нет символа новой строки. Я попробовал перенаправить вывод в sed
:
printf '@%.0s' $(seq 1 $N) | sed '$s/$/\n/'
Можно ли добиться того же результата одним нажатием printf
(добавив символ новой строки в конце вывода) без использования sed?
решение1
printf %.1s @{1..20} $'\n'
оболочка сначала раскрывает фигурные скобки, это называется «Раскрытие фигурных скобок».
@{1..20}
в @1 @2 @3 ...
и т. д.
Затем будет выведен первый байт каждого параметра, включая последний аргумент, $'\n'
состоящий из одного байта — символа новой строки.
решение2
С zsh
:
printf '%s\n' ${(l[20][@])}
(используя l
левое заполнение)флаг расширения параметра. Здесь вы также можете использовать r
легкую подкладку).
Конечно, вам не обязательно использовать printf
. Вы также можете использовать print
или echo
здесь, которые добавляют a \n
по умолчанию. ( printf '%s\n' "$string"
можно написать print -r -- "$string"
или echo -E - "$string"
в zsh
, хотя, если $string
не содержит обратных косых черт и не начинается с -
, это можно упростить до print "$string"
/ echo "$string"
).
Если конечной целью является отображение списка строк, дополненных по ширине экрана, то можно сделать следующее:
$ 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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Где m
флаг заставляет zsh учитывать ширину отображения каждого символа (как для приведенных выше символов двойной ширины (которые ваш браузер может отображать не точно с двойной шириной, но ваш терминал должен)).
print -rC1 --
аналогично printf '%s\n'
или print -rl --
для вывода одного элемента на строку, за исключением случая, когда ему не переданы аргументы (например, when lines=()
), в этом случае он ничего не печатает вместо пустой строки).
решение3
Я использую это в скрипте:
printf '%150s\n' | tr ' ' '@'
решение4
Решение оригинального поста, опубликованного более года назад:
повторение символа с помощью printf и добавление новой строки в конце
printf '@%.0s' $(seq 1 $N); echo
На всякий случай, если у кого-то еще возникнет такая же или похожая проблема.