повторение символа с помощью printf и добавление новой строки в конце

повторение символа с помощью printf и добавление новой строки в конце

Чтобы повторить символ 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

На всякий случай, если у кого-то еще возникнет такая же или похожая проблема.

Связанный контент