Чи є вбудована команда 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
Це може бути параметризовано і не вимагає змінної temp, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
Або, якщо $N
розмір масиву bash:
echo ${ARR[@]/*/blah}
printf
специфікатор формату. Що робити, якщо дані містять рядки формату? Це правильний спосіб динамічно вказати "точність" (довжина): printf '%*s' "$N"
- зробіть звичку додавати рядок формату в єдині лапки, щоб запобігти розширенню змінної там.
Чимало вже згадуваних хороших способів. Не можу забути про хороше старе seq
:
[john @ awesome] $ for i in `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"}'
Результат
HelloHelloHelloHello
на основі того, на що натякав @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, наприклад n багатьох дистрибутивів Linux та Cygwin. Додайте сюди інформацію для тих, хто пропускає інформацію про те, що вона працює лише у послідовності BSD.
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)
Створимо (сто тире):