it-swarm.asia

قيادة لينكس لتكرار سلسلة ن مرات

هل هناك أي أمر Linux مدمج يسمح بإخراج سلسلة تكون n عبارة عن سلسلة إدخال؟

67
GetFree
[email protected]:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
[email protected]:~$
70
Adrian Petrescu

في ما يلي طريقة قديمة محمولة للغاية:

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}
67
Dennis Williamson

عدد قليل من الطرق الجيدة التي سبق ذكرها. لا يمكن أن ننسى حسن seq رغم:

[john @ awesome] $ for i in `seq 5`؛ فعل صدى "مرحبًا" ؛ تم القيام به 
 مرحبًا 
 مرحبًا 
 مرحبًا 
 مرحبًا 
 مرحبًا
13
John T

يمكن أن يكون هذا معلمات ولا يتطلب متغير مؤقت ، FWIW:

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

أو ، إذا كان $N هو حجم صفيف bash:

echo ${ARR[@]/*/blah}
11
twifkak

يمكنك استخدام خدعة. صدى متغير فارغ لا يطبع أي شيء. حتى تتمكن من الكتابة:

echo Word$wojek{1..100}

إذا كانت $wojek1 $wojek2 ... $wojek100 هي متغيرات غير موجودة ، فستتكرر Word الخاص بك 100 مرة دون أي شيء آخر.

9
Wojciech Waga

ربما طريقة أخرى أكثر عمومية ومفيدة لك:

[email protected]:~$ n=5
[email protected]:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
[email protected]:~$ 

شل باش أقوى مما يعتقد معظم الناس :)

9
Adrian Petrescu

كرر n مرة ، فقط ضع n-1 فواصل بين {}:

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

يكرر "helloworld" مرتين بعد الصدى الأول.

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

نتيجة

مرحبا مرحبا مرحبا مرحبا
5
Steven Penny

استنادا إلى ما @ بايك كان يلمح إلى

لكل شخصية في سلسلة صدى سلسلة

echo ${target//?/$replace}

مثال لعنوان مسطر بأحرف =

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

سوف الإخراج

ABCDEF
======

يبدو أن هذا المنفذ بين نظامي التشغيل Linux و OS X وهذا يجعلني سعيدًا.

منتديات الشاعر تركي الميزاني!

3
nickl-

لقد واجهت تحذيرات أنابيب مكسورة مع الحل yes ، لذلك إليك بديل جيد آخر:

$ seq 4 | sed "c foo"
foo
foo
foo
foo
3
n.caillou

إذا كنت على BSD ، يمكنك فقط استخدام seq.

$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
3
Qix

ليس بالضبط المدمج في لينكس ، ولكن إذا كان لديك بيثون مثبتة ..

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

أو في سطر واحد ، كما اقترح المعلق:

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

بافتراض أنك تريد شيئًا ما مثل عامل التشغيل Perl's x ، حيث لا تحصل تلقائيًا على سطر جديد بين التكرار:

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: يتم توسيع دعامة قبل استبدال متغير.

2
glenn jackman
line="==========================="
line=${line:0:10}
${line//"="/"ten "}

المخرجات

ten ten ten ten ten ten ten ten ten ten
2
commonpike

لا سحر هنا:

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

1
brablc

جرب هذه:

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

سوف يخلق (مائة اندفاعة):


1
Alle Aldine