هل هناك أي أمر Linux مدمج يسمح بإخراج سلسلة تكون n عبارة عن سلسلة إدخال؟
[email protected]:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
[email protected]:~$
في ما يلي طريقة قديمة محمولة للغاية:
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}
عدد قليل من الطرق الجيدة التي سبق ذكرها. لا يمكن أن ننسى حسن seq
رغم:
[john @ awesome] $ for i in `seq 5`؛ فعل صدى "مرحبًا" ؛ تم القيام به مرحبًا مرحبًا مرحبًا مرحبًا مرحبًا
يمكن أن يكون هذا معلمات ولا يتطلب متغير مؤقت ، FWIW:
printf "%${N}s" | sed 's/ /blah/g'
أو ، إذا كان $N
هو حجم صفيف bash:
echo ${ARR[@]/*/blah}
يمكنك استخدام خدعة. صدى متغير فارغ لا يطبع أي شيء. حتى تتمكن من الكتابة:
echo Word$wojek{1..100}
إذا كانت $wojek1 $wojek2
... $wojek100
هي متغيرات غير موجودة ، فستتكرر Word الخاص بك 100 مرة دون أي شيء آخر.
ربما طريقة أخرى أكثر عمومية ومفيدة لك:
[email protected]:~$ n=5
[email protected]:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
[email protected]:~$
شل باش أقوى مما يعتقد معظم الناس :)
كرر n
مرة ، فقط ضع n-1
فواصل بين {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
يكرر "helloworld" مرتين بعد الصدى الأول.
awk 'BEGIN {while (c++<4) printf "Hello"}'
نتيجة
مرحبا مرحبا مرحبا مرحبا
استنادا إلى ما @ بايك كان يلمح إلى
لكل شخصية في سلسلة صدى سلسلة
echo ${target//?/$replace}
مثال لعنوان مسطر بأحرف =
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
سوف الإخراج
ABCDEF
======
يبدو أن هذا المنفذ بين نظامي التشغيل Linux و OS X وهذا يجعلني سعيدًا.
منتديات الشاعر تركي الميزاني!
لقد واجهت تحذيرات أنابيب مكسورة مع الحل yes
، لذلك إليك بديل جيد آخر:
$ seq 4 | sed "c foo"
foo
foo
foo
foo
إذا كنت على BSD ، يمكنك فقط استخدام seq
.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
ليس بالضبط المدمج في لينكس ، ولكن إذا كان لديك بيثون مثبتة ..
python
>>>var = "string"
>>>var*n
أو في سطر واحد ، كما اقترح المعلق:
python -c 'print "This is a test.\n" * 10'
بافتراض أنك تريد شيئًا ما مثل عامل التشغيل 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: يتم توسيع دعامة قبل استبدال متغير.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
المخرجات
ten ten ten ten ten ten ten ten ten ten
لا سحر هنا:
seq 5 | awk '{print "Hello World"}'
جرب هذه:
echo $(for i in $(seq 1 100); do printf "-"; done)
سوف يخلق (مائة اندفاعة):