Linux команда повторить строку n раз

93305
GetFree

Есть ли какая-либо встроенная команда Linux, которая позволяет выводить строку, которая в n раз больше входной строки ??

58
Под «встроенной командой linux» я предполагаю, что вы имеете в виду команду оболочки, а поскольку вы не упоминаете, какую оболочку вы используете, я предполагаю, что это bash. Вы можете проверить это, набрав «echo $ SHELL» в командной строке, и вы должны получить что-то похожее на «/ bin / bash». Если вы этого не сделаете, вы должны отредактировать свой ответ, чтобы указать, что он показывает. Ура :) Adrian Petrescu 14 лет назад 1
Я пометил вопрос с "Баш". Я думал, что этого было бы достаточно. GetFree 14 лет назад 7
Связано с [SO]: http://stackoverflow.com/q/3211891/2157640 Palec 10 лет назад 1

16 ответов на вопрос

64
Adrian Petrescu
adrian@Fourier:~$ printf 'HelloWorld\n%.0s'  HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld adrian@Fourier:~$ 
Не могли бы вы объяснить, как это работает? Я понимаю команду printf, поскольку она такая же, как в C / C ++. Но я не понимаю, как расширяется и как это работает в сочетании с частью "% .0s". GetFree 14 лет назад 2
Это что-то вроде хака :) Попробуйте запустить "printf 'HelloWorld% d \ n' 1 2 3 4 5", и он, вероятно, щелкнет для вас. Флаг% .0s предназначен для того, чтобы ничего не делать, просто быть там, чтобы подобрать аргументы. Затем, если bash получит больше аргументов, чем имеет спецификатор формата, он просто распечатает несколько копий, захватив столько, сколько ему нужно. Таким образом, вы получите эффект. Вывод "printf 'HelloWorld% d% d \ n' 1 2 3 4 5 6", вероятно, делает его еще более понятным. Надеюсь это поможет! Adrian Petrescu 14 лет назад 3
Понимаю. Это специфическое поведение printf, которое позволяет повторение GetFree 14 лет назад 0
(Следует отметить, что с чисто теоретической точки зрения это, вероятно, самое быстрое решение, поскольку оно использует один примитив оболочки, а не какие-либо внешние процессы. Однако в действительности, давайте посмотрим правде в глаза, производительность сценариев bash на самом деле не имеет значения: ) Adrian Petrescu 14 лет назад 1
NB. Расширение не является специфичным для printf. Это синтаксис bash, который расширяется до последовательности чисел x, x + 1, ..., y. Например, попробуйте "echo ". Это находится в разделе «Brace Expansion» на странице руководства bash (и называется «выражение последовательности»). larsks 14 лет назад 0
Что характерно для * printf`, так это то, что он будет неоднократно применять избыточные аргументы к строке формата, "зацикливаясь" бесплатно. Под «избытком» я подразумеваю, что аргументов больше, чем заполнителей `%`. Dennis Williamson 12 лет назад 0
Uggh. Почему `bash` (POSIX?) Решил сделать это полностью за мной. Я был укушен этим, когда возился с моей конфигурацией GRUB2. new123456 12 лет назад 0
Это не работает, если мы хотим повторить 0 раз. icando 12 лет назад 0
61
Dennis Williamson

Вот старомодный способ, который довольно портативный:

yes "HelloWorld" | head -n 10 

Это более общепринятая версия ответа Адриана Петреску с использованием расширения скобки:

for i in  do echo "HelloWorld" done 

Это эквивалентно:

for i in 1 2 3 4 5 

Это немного более краткая и динамичная версия щуки ответа:

printf -v spaces '%*s' 10 ''; printf '%s\n' $ 
Как избавиться от новых строк при использовании команды yes? GetFree 14 лет назад 0
Один из способов - передать его через `sed -n 'H; $ '` или `sed -n ': t; $ ; N; bt'` другой - сделать `echo $ (yes" HelloWorld "| head -n 10)`, который добавляет пробел между каждой копией строки. Еще один способ - передать его через `tr -d '\ n'`, что также устраняет последний перевод строки. Dennis Williamson 14 лет назад 3
Это как Haskell в оболочке bash: Hashell? wchargin 10 лет назад 1
Да, решение довольно опрятно piggybox 9 лет назад 4
Решение «да» было именно тем, что мне было нужно, так как я хотел продублировать команду (выход которой колеблется). Таким образом: `yes" $ (my-command) "| голова -n 2` arnsholt 8 лет назад 0
@arnsholt: я не уверен, что вы подразумеваете под колебаниями. Подстановка команды запускается только один раз, и `yes` выводит одно и то же (один вывод подстановки команды) несколько раз. Например, сравните `yes" $ (дата +% N; сон 1) "| head -n 4` и `for i в ; сделать дату +% ​​N; сон 1; done` Dennis Williamson 8 лет назад 0
Вывод основан на случайной выборке, поэтому выполнение команды дважды приводит к несколько разным результатам каждый раз. Я на самом деле хотел одну и ту же строку дважды (потому что вывод шел в сценарий, который генерирует таблицу, и эта конкретная строка должна была быть одинаковым числом дважды (где другие строки менялись, очевидно)). arnsholt 8 лет назад 0
@arnsholt: ОК, я бы использовал цикл `for` вместо порождения внешнего исполняемого файла (` yes`). Или перехватите его один раз и выведите дважды, например: `out = $ (my-command); printf '% s \ n' "$ out" "$ out" `(` printf` будет применять избыточные аргументы последовательно) или другие подобные методы. Dennis Williamson 8 лет назад 0
12
John T

Несколько хороших способов уже упоминалось. Не могу забыть о старом добром, seqхотя:

[john @ awesome] $ для меня в `seq 5`; сделать эхо "Привет" сделано Привет Привет Привет Привет Привет
Этот на самом деле уважает ноль, рассматривая его как ноль! (Трюк `` никогда не возвращает пустой диапазон.) JellicleCat 8 лет назад 0
9
Adrian Petrescu

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

adrian@Fourier:~$ n=5 adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld adrian@Fourier:~$  

Оболочка bash более мощная, чем думает большинство людей :)

Это получает мой голос, так как это полностью внутренняя оболочка; разветвление не требуется. esm 14 лет назад 0
На какую разветвленность ты ссылаешься? Оригинальный ответ не требует ничего. Выводом «type printf» является «printf - встроенная оболочка», и поэтому он выполняется в исходном процессе bash. CodeGnome 12 лет назад 1
9
Wojciech Waga

Вы можете использовать трюк. Вывод пустой переменной ничего не печатает. Таким образом, вы можете написать:

echo word$wojek 

Если $wojek1 $wojek2... $wojek100несуществующие переменные, ваше слово будет повторяться 100 раз без чего-либо еще.

Это безобразный, уродливый хак, и все же я не могу не любить его и использовать его. 16807 7 лет назад 1
8
twifkak

Это может быть параметризовано и не требует временной переменной, FWIW:

printf "%$s" | sed 's/ /blah/g' 

Или, если $Nэто размер массива bash:

echo $ 
Это самое короткое [POSIX 7] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html#tag_20_94) решение, которое я видел до сих пор со времен `seq`,` yes` и ` `не POSIX 7. Ciro Santilli 新疆改造中心 六四事件 法轮功 10 лет назад 2
7
kev

повторить nраз, просто положить n-1 ,в {}:

$ echo 'helloworld'{,,} helloworld helloworld helloworld 
Хорошо, но что, если я хочу получить `n` из переменной? GetFree 12 лет назад 4
это добавляет дополнительное пространство после каждого 'helloworld' Seti Volkylany 7 лет назад 1
5
Steven Penny
awk 'BEGIN ' 

Результат

Привет привет привет привет 
Используйте это без awk: while ((c ++ <5)); сделать printf 'привет'; сделанный emf 7 лет назад 0
3
nickl-

основываясь на том, на что намекал @pike

для каждого символа в строке эхо-строки

echo $ 

Пример заголовка, подчеркнутого =символами

export heading='ABCDEF';  export replace='=';  echo -e "$\n$" 

будет выводить

ABCDEF ====== 

Кажется, это порт между Linux и OS X, и это делает меня счастливым.

NJoy!

3
Qix

Если вы на BSD, вы можете просто использовать seq.

$ seq -f "Hello, world" 5 Hello, world Hello, world Hello, world Hello, world Hello, world 
В `seq (GNU coreutils) 8.25` это дает` seq: format 'Hello, world' не имеет директивы %`, заставляя присутствовать директиву форматирования. GNU coreutils используются, например, во многих дистрибутивах Linux и Cygwin. Включая информацию здесь для тех, кому не хватает информации, что она работает только в BSD seq. Palec 7 лет назад 0

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