63

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

16 ответов16

68
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
64

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

yes "HelloWorld" | head -n 10

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

for i in {1..5}
do
    echo "HelloWorld"
done

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

for i in 1 2 3 4 5

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

printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
13

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

[john@awesome]$for i in `seq 5`; do echo "Hi";done
Hi
Hi
Hi
Hi
Hi
10

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

printf "%${N}s" | sed 's/ /blah/g'

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

echo ${ARR[@]/*/blah}
9

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

echo word$wojek{1..100}

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

9

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

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

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

7

Повторите n раз, просто поставьте n-1 запятую между {}:

$ echo 'helloworld'{,,}
helloworld helloworld helloworld

Повторяет «helloworld» дважды после первого эха.

5
awk 'BEGIN {while (c++<4) printf "Hello"}'

Результат

HelloHelloHelloHello
3

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

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

echo ${target//?/$replace}

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

export heading='ABCDEF'; 
export replace='='; 
echo -e "${heading}\n${heading//?/$replace}"

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

ABCDEF
======

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

NJoy!

3

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

$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
2

Не совсем встроенный в Linux, но если у вас установлен Python ..

python
>>>var = "string"
>>>var*n

Или в одной строке, как предложил комментатор:

python -c 'print "This is a test.\n" * 10'
2

Я получил предупреждение о сломанной трубе с решением yes , так что вот еще одна хорошая альтернатива

$ seq 4 | sed "c foo"
foo
foo
foo
foo
2
line="==========================="
line=${line:0:10}
${line//"="/"ten "}

выходы

ten ten ten ten ten ten ten ten ten ten
1

Никакой магии здесь:

seq 5 | awk '{print "Hello World"}'

1

Предполагая, что вы хотите что-то вроде оператора x Perl, где вы не получите автоматически новую строку между повторениями:

x() {
  # usage: x string num
  for i in $(seq 1 $2); do printf "%s" "$1"; done
  # print a newline only if the string does not end in a newline
  [[ "$1" == "${1%$'\n'}" ]] && echo ""
}

x Hi 10  # ==> HiHiHiHiHiHiHiHiHiHi

x $'Hello World!\n' 3

Я явно использовал цикл for потому что вы не можете написать {1..$n} в bash: расширение скобки выполняется перед заменой переменной.

1

Попробуй это:

echo $(for i in $(seq 1 100); do printf "-"; done)

Создадим (сто тире):


Всё ещё ищете ответ? Посмотрите другие вопросы с метками .