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

Команда CMake cmake_policy()описана в документации CMake .

Обычно он добавляется в файл CMakeLists.txtпроекта, чтобы изменить поведение самого CMake, обычно для того, чтобы иметь возможность обрабатывать старые CMakeLists.txtфункции с более новыми версиями CMake.

Вы можете использовать его для установки отдельной политики, используя

cmake_policy(SET CMP OLD)

где — номер политики CMake, а OLDуказывает, что вы хотите «старое поведение» этой политики (слово OLDтакже может бытьNEW).

Или вы можете использовать команду для установки политик совместимости с определенной версией CMake, используя

cmake_policy(VERSION x.xx)

где x.xxдолжно быть как минимум 2.4.

В любом случае CMakeLists.txtфайл проекта будет изменен, и cmakeпридется повторно -запустить.

См. также документацию поcmake_minimum_required().

8
23.09.2020, 16:19
6 ответов

Сzsh:

printf '%s\n' ${(l[20][@])}

(с помощью lлевого -заполнения флага расширения параметра . Вы также можете использовать right padding здесь ).

Конечно, вам не обязательно использовать printf. Вы также можете использовать printили echo, которые добавляют \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 --для печати одного элемента в строке, за исключением случая, когда ему не передаются никакие аргументы (например, когдаlines=())и в этом случае он ничего не печатает вместо пустой строки ).

8
18.03.2021, 23:03

Я использую это в скрипте :printf '%150s\n' | tr ' ' '@'

2
18.03.2021, 23:03
printf %.1s @{1..20} $'\n'

Оболочка сначала расширяет фигурные скобки, это называется «Расширение фигурной скобки».
@{1..20}в @1 @2 @3...и так далее
Затем будет выведен первый байт каждого параметра, включая последний аргумент $'\n', состоящий из одного байта -символ новой строки

14
18.03.2021, 23:03

Версия, которая будет печатать столько, сколько вы хотите (ограничение размера строки оболочки не срабатывает, если у вас есть, скажем, 1000000 чисел для печати):

seq 1 $n |  xargs printf '@%.0s'   
printf '\n'

примечание:если вы добавите -p к xargs (xargs -p...):он подсказывает каждый раз, когда хочет запустить команду, таким образом, он показывает, что он втискивает столько аргументов после printf, как может, поэтому он запускает всего несколько printf, а не 1 на каждый аргумент! (вот и вся цель xargs)

если вы просто хотите сгенерировать произвольную длинную строку @:

yes "@" | head -n "$n" | tr -d '\n'
printf '\n'

просто вызывает yes и tr один раз и должно быть довольно быстрым

0
18.03.2021, 23:03

В других ответах использовались расширения стандартного синтаксиса оболочки, которые доступны в определенных оболочках, таких как оболочки Korn, Z и Bourne Again. В этом нет ничего плохого, но есть альтернативный подход.

Можно воспользоваться тем фактом, что (и )видеотерминалы не являются "тупыми" и никогда ими не были; и (b )в настоящее время, в третьем десятилетии 21-го века, большинство видеотерминалов и даже их эмуляторов , в значительной степени сходятся в понимании ECMA -48, а не системы управления последовательностью их.

ECMA -48, начиная с его первых дней в 1970-х годах, определил управляющую последовательность REP, которая является CSI, параметром и bв качестве конечного символа. Это повторяет предыдущий графический символ, напечатанный (, среди прочего, который я не буду здесь рассматривать, поскольку нас интересуют только графические символы ).

Эмуляторам терминалов потребовалось некоторое время, чтобы догнать настоящие терминалы. В то время как устройства серии DEC VT5xx в 1990-х понимали REP, только в последнее десятилетие он стал обычным явлением в эмуляторах терминалов. XTerm намного опередил большинство и понял это с 1996 года, но libVTE и KDE Konsole не догнали его до 2017 и 2018 годов.

Таким образом, пока ваш реальный видеотерминал или эмулятор терминала понимает то, что было стандартизировано в 1970-х годах, и вы не используете бумажный терминал (, что крайне маловероятно ),печать @20 раз может быть выполнена с без оболочки -специального синтаксиса, без конвейеров команд, без подстановок или редактирования потока, и простоprintf:

printf '@\033[%db\n' 19
]

Это работает практически со всеми оболочками, даже с оболочкой Debian Almquist.

Вы можете проверить базу данных termcap/terminfo на наличие возможности repeat_char/ rep, чтобы определить, поддерживает ли тип терминала REP. (Применяются обычные предостережения. :Некоторые старые реальные терминалы реагируют на управляющие последовательности, отличные от -ECMA -48, и tput rpв общем случае является лучшим подходом, чем printf, хотя не -ECMA -48 случай на практике весьма маловероятен; вы должны проверить правильный тип терминала, который соответствует вашему терминалу, а не просто ошибочно предположить "О, это xterm."; и ваша база данных terminfo/termcap должна быть обновлена ​​с -до -.)

Тем не менее, удивительно, что мир, в котором есть banner, figlet, boxesи cowsay, не создал и не распространил простую утилиту, которая могла бы испускать различные стили горизонтального правила во всех эти годы. Представь:

hr -c @ -n 20
3
18.03.2021, 23:03

Один printf, заканчивается новой строкой, переменный размер, работает с тире, ksh, bash и zsh:

$ printf '%*.0s\n' 33 "" | tr " " "@"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
7
18.03.2021, 23:03

Теги

Похожие вопросы