Есть ли какая-либо встроенная команда Linux, которая позволяет выводить строку, которая в n раз больше входной строки ??
Есть ли какая-либо встроенная команда Linux, которая позволяет выводить строку, которая в n раз больше входной строки ??
Ответы:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printf
том , что он будет повторно применить лишние аргументы в строку формата, «перекручивание» бесплатно. Под «избытком» я подразумеваю, что аргументов больше, чем %
заполнителей.
Вот старомодный способ, который довольно портативный:
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}
sed -n 'H;${x;s/\n//gp}'
а sed -n ':t;${s/\n//gp};N;bt'
другой - echo $(yes "HelloWorld" | head -n 10)
добавить пробел между каждой копией строки. Еще один способ состоит в том, чтобы пройти через него, tr -d '\n'
что также устраняет последний перевод строки.
yes
Решение было именно то , что мне было нужно, так как я хотел , чтобы дублировать команду (выход которого колеблется). Таким образом:yes "$(my-command)" | head -n 2
Это может быть параметризовано и не требует временной переменной, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
Или, если $N
это размер массива bash:
echo ${ARR[@]/*/blah}
seq
, yes
и оно {1..5}
не является POSIX 7.
printf
спецификаторе формата. Что если данные содержат строки формата? Это правильный способ динамически определять «точность» (длину): printf '%*s' "$N"
- сделать привычкой заключать строку формата в одинарные кавычки, чтобы предотвратить расширение переменной там.
Несколько хороших способов уже упоминалось. Не могу забыть о старом добром, seq
хотя:
[john @ awesome] $ для меня в `seq 5`; сделать эхо "Привет" сделано Здравствуй Здравствуй Здравствуй Здравствуй Здравствуй
{i..j}
Трюк никогда не возвращает пустой диапазон.)
Возможно, другой способ, который является более общим и полезным для вас:
adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
Оболочка bash более мощная, чем думает большинство людей :)
yes
, printf
, for i in {1..5}
) , что если n
равен нулю, то возвращается пустая строка , не существует состояние 1. Также в связи с математической нотации для сравнения, легко компенсировали на 1 (например , путем изменения <=
в <
)
Вы можете использовать трюк. Вывод пустой переменной ничего не печатает. Таким образом, вы можете написать:
echo word$wojek{1..100}
Если $wojek1 $wojek2
... $wojek100
несуществующие переменные, ваше слово будет повторяться 100 раз без чего-либо еще.
$_
вместо того, чтобы $wojek
сделать намерение более ясным.
Повторите n
раз, просто поставьте n-1
запятые между {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Повторяет «helloworld» дважды после первого эха.
n
из переменной?
awk 'BEGIN {while (c++<4) printf "Hello"}'
Результат
Привет привет привет привет
основываясь на том, на что намекал @pike
для каждого символа в строке
echo ${target//?/$replace}
Пример заголовка, подчеркнутого =
символами
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
будет выводить
ABCDEF
======
Кажется, это порт между Linux и OS X, и это делает меня счастливым.
NJoy!
Если вы на 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' has no % directive
, заставляя директиву форматирования присутствовать. GNU coreutils используются, например, во многих дистрибутивах Linux и Cygwin. Включая информацию здесь для тех, кому не хватает информации, что она работает только в BSD seq.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
выходы
ten ten ten ten ten ten ten ten ten ten
Предполагая, что вы хотите что-то вроде 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: раскрытие скобки выполняется до подстановки переменной.
Не совсем встроенный в Linux, но если у вас установлен Python ..
python
>>>var = "string"
>>>var*n
Или в одной строке, как предложил комментатор:
python -c 'print "This is a test.\n" * 10'
Попробуй это:
echo $(for i in $(seq 1 100); do printf "-"; done)
Создадим (сто тире):