লিনাক্সের এমন কোনও কমান্ড রয়েছে যা কোনও স্ট্র্যাপের আউটপুট দিতে দেয় যা ইনপুট স্ট্রিংয়ের চেয়ে দ্বিগুণ?
লিনাক্সের এমন কোনও কমান্ড রয়েছে যা কোনও স্ট্র্যাপের আউটপুট দিতে দেয় যা ইনপুট স্ট্রিংয়ের চেয়ে দ্বিগুণ?
উত্তর:
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
কোনও ব্যাশ অ্যারের আকার হয়:
echo ${ARR[@]/*/blah}
printf
ফর্ম্যাট নির্দিষ্টকরণকারীর সাথে ডেটা মিশ্রিত করা উচিত নয় । যদি ডেটাতে ফর্ম্যাট স্ট্রিং থাকে? এটি "স্পষ্টতা" (দৈর্ঘ্য) গতিশীলভাবে নির্দিষ্ট করার সঠিক উপায়: printf '%*s' "$N"
- সেখানে ভেরিয়েবলের বিস্তার রোধ করতে একক উদ্ধৃতিতে বিন্যাসের স্ট্রিংটি সংযুক্ত করার অভ্যাস করুন make
ইতিমধ্যে উল্লেখ করা বেশ কয়েকটি ভাল উপায়। ভাল পুরানো সম্পর্কে ভুলবেন না seq
যদিও:
[জন @ বিস্ময়কর] $ আমি q সেক 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:~$
ব্যাশ শেল বেশিরভাগ লোকের চেয়ে বেশি শক্তিশালী :)
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
প্রথম প্রতিধ্বনির পরে দুবার 'হেলিওর্ল্ড' পুনরাবৃত্তি করে।
n
কোনও ভেরিয়েবল থেকে পেতে চাই তবে কী হবে ?
awk 'BEGIN {while (c++<4) printf "Hello"}'
ফলাফল
হ্যালো হ্যালো হ্যালো হ্যালো
@ পাইক ইঙ্গিত করছিল তার উপর ভিত্তি করে
স্ট্রিং ইকো স্ট্রিংয়ের প্রতিটি চরিত্রের জন্য
echo ${target//?/$replace}
=
অক্ষরের সাথে আন্ডারলাইন করা শিরোনামের উদাহরণ
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
আউটপুট হবে
ABCDEF
======
এটি লিনাক্স এবং ওএস এক্সের মধ্যে বন্দর বলে মনে হয় এবং এটি আমাকে খুশি করে।
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
, একটি ফর্ম্যাটিং নির্দেশ উপস্থিত থাকতে বাধ্য করে। জিএনইউ কোর্টিলগুলি ব্যবহার করা হয় যেমন এন লিনাক্সের অনেকগুলি বিতরণ এবং সাইগউইন used এটি কেবল বিএসডি সিকিমে কাজ করে এমন তথ্য হারিয়ে যাওয়ার জন্য এখানে তথ্য সহ।
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
আউটপুট
ten ten ten ten ten ten ten ten ten ten
ধরে নিচ্ছি আপনি পার্লের 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}
ব্যাশে লিখতে পারবেন না : পরিবর্তনশীল প্রতিস্থাপনের আগে ব্রেস সম্প্রসারণ করা হয়।
লিনাক্সে ঠিক অন্তর্নির্মিত নয়, তবে যদি আপনি পাইথন ইনস্টল করেন ..
python
>>>var = "string"
>>>var*n
অথবা একটি লাইনে, মন্তব্যকারীদের পরামর্শ অনুসারে:
python -c 'print "This is a test.\n" * 10'
আর একবার চেষ্টা কর:
echo $(for i in $(seq 1 100); do printf "-"; done)
(একশ ড্যাশ) তৈরি করবে: