লিনাক্স কমান্ড একটি স্ট্রিং n বার পুনরাবৃত্তি


71

লিনাক্সের এমন কোনও কমান্ড রয়েছে যা কোনও স্ট্র্যাপের আউটপুট দিতে দেয় যা ইনপুট স্ট্রিংয়ের চেয়ে দ্বিগুণ?


1
"বিল্ট-ইন লিনাক্স কমান্ড" দ্বারা আমি ধরে নিই যে আপনি শেল কমান্ডটি বোঝাচ্ছেন, এবং আপনি কোন শেল ব্যবহার করছেন তা উল্লেখ না করায় আমি ধরে নিলাম এটি বাশ। আপনি কমান্ড লাইনে "প্রতিধ্বনি $ শেল" টাইপ করে এটি পরীক্ষা করতে পারেন এবং "/ bin / bash" এর মতো কিছু পাওয়া উচিত। যদি আপনি এটি না করেন তবে আপনার উত্তরটি সম্পাদনা করা উচিত যা এটি প্রদর্শিত হবে তা নির্দিষ্ট করে। চিয়ার্স :)
অ্যাড্রিয়ান পেট্রেস্কু

7
আমি প্রশ্নটি "বাশ" দিয়ে ট্যাগ করেছি। আমি ভেবেছিলাম যে যথেষ্ট হবে।
ফ্রি

উত্তর:


75
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$

3
আপনি কিভাবে এটি কাজ করে তা ব্যাখ্যা করতে পারেন? আমি প্রিন্টফ কমান্ডটি বুঝতে পারি যেহেতু এটি সি / সি ++ এর মতোই। তবে আমি বুঝতে পারি না যে কীভাবে {1..5 expand প্রসারিত এবং কীভাবে এটি "% .0s" অংশের সাথে কাজ করে।
ফ্রি

4
এটি কিছুটা হ্যাক :) "প্রিন্টফ 'হ্যালো ওয়ার্ল্ড% d \ n' 1 2 3 4 5" চালানোর চেষ্টা করুন এবং এটি সম্ভবত আপনার জন্য ক্লিক করবে। % .0s পতাকাটি কিছুই না বোঝাতে বোঝায়, কেবল যুক্তি বাছাই করার জন্য সেখানে থাকুন। তারপরে, যদি ব্যাশ ফর্ম্যাট স্পেসিফাইয়ারগুলির চেয়ে বেশি যুক্তি পায় তবে এটি কেবল একাধিক অনুলিপি মুদ্রণ করবে, এটি যতটা প্রয়োজন তা দখল করবে। সুতরাং আপনি প্রভাব পেতে। "প্রিন্টফ 'হ্যালো ওয়ার্ল্ড% d% d \ n' 1 2 3 4 5 6" এর আউটপুট সম্ভবত এটি আরও পরিষ্কার করে। আশাকরি এটা সাহায্য করবে!
অ্যাড্রিয়ান পেট্রেস্কু

আমি দেখি. এটি
প্রিন্টফের

1
(আমার মনে রাখা উচিত, একটি নিখুঁত তাত্ত্বিক অবস্থান থেকে, এটি সম্ভবত সবচেয়ে দ্রুত সমাধান যেহেতু এটি একটি একক শেল আদিম ব্যবহার করে - কোনও বাহ্যিক প্রক্রিয়া নয় reality বাস্তবে, আসুন আমরা এটির মুখোমুখি হই, বাশ স্ক্রিপ্টগুলির কার্যকারিতা আসলেই গুরুত্বপূর্ণ নয়: )
অ্যাড্রিয়ান পেট্রেস্কু

1
কীসের সাথে সুনির্দিষ্ট তা printfহ'ল এটি বারবার বিন্যাসের স্ট্রিংয়ের জন্য অতিরিক্ত "যুক্তি বিনামূল্যে" প্রয়োগ করবে। "অতিরিক্ত" দ্বারা, আমি বোঝাতে চাইছি যে %স্থানধারীদের চেয়ে আরও বেশি যুক্তি রয়েছে ।
ডেনিস উইলিয়ামসন

69

এখানে একটি পুরানো ধাঁচের উপায় যা বেশ বহনযোগ্য:

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}

হ্যাঁ আদেশটি ব্যবহার করার সময় আপনি কীভাবে নতুন লাইনগুলি থেকে মুক্তি পাবেন?
ফ্রি

3
একটি উপায় হ'ল এটির মাধ্যমে পাইপ করা sed -n 'H;${x;s/\n//gp}'বা sed -n ':t;${s/\n//gp};N;bt'অন্যটি হ'ল echo $(yes "HelloWorld" | head -n 10)যা স্ট্রিংয়ের প্রতিটি অনুলির মধ্যে একটি স্থান যুক্ত করে। তবুও অন্য উপায় হ'ল এটির পাইপ tr -d '\n'যার মাধ্যমে চূড়ান্ত নিউলাইনও সরিয়ে দেওয়া হয়।
ডেনিস উইলিয়ামসন

2
এটি বাশ শেলের মতো হাসেলের মতো: হাশেল?
wchargin

4
হ্যাঁ সমাধানটি বেশ ঝরঝরে
piggybox

yesযেহেতু আমি একটি কমান্ড (যার আউটপুট ওঠানামা) প্রতিলিপি করতে চেয়েছিলেন সমাধান আমি ঠিক কী প্রয়োজন ছিল তা ছিল। এভাবে:yes "$(my-command)" | head -n 2
আর্নশোল্ট

14

এটি প্যারামিটারাইজড হতে পারে এবং একটি অস্থায়ী ভেরিয়েবলের প্রয়োজন হয় না, FWIW:

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

বা, যদি $Nকোনও ব্যাশ অ্যারের আকার হয়:

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

3
এই সংক্ষিপ্ত হয় POSIX 7 সমাধান আমি এতদূর থেকে দেখেছি seq, yesএবং {1..5}7. POSIX নেই
সিরো Santilli新疆改造中心法轮功六四事件

আপনার printfফর্ম্যাট নির্দিষ্টকরণকারীর সাথে ডেটা মিশ্রিত করা উচিত নয় । যদি ডেটাতে ফর্ম্যাট স্ট্রিং থাকে? এটি "স্পষ্টতা" (দৈর্ঘ্য) গতিশীলভাবে নির্দিষ্ট করার সঠিক উপায়: printf '%*s' "$N"- সেখানে ভেরিয়েবলের বিস্তার রোধ করতে একক উদ্ধৃতিতে বিন্যাসের স্ট্রিংটি সংযুক্ত করার অভ্যাস করুন make
ডেনিস উইলিয়ামসন

13

ইতিমধ্যে উল্লেখ করা বেশ কয়েকটি ভাল উপায়। ভাল পুরানো সম্পর্কে ভুলবেন না seqযদিও:

[জন @ বিস্ময়কর] $ আমি q সেক 5 ম ইন ইন; "হাই"; ইকো করুন
ওহে
ওহে
ওহে
ওহে
ওহে

এই এক আসলে শূন্য হিসাবে সম্মান, একটি শূন্য সম্মান! ( {i..j}কৌশলটি কখনই কোনও শূন্য পরিসর দেয় না))
জেলিকেলকিট

10

আপনার জন্য আরও সাধারণ এবং কার্যকর যে সম্ভবত অন্য উপায়:

adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$ 

ব্যাশ শেল বেশিরভাগ লোকের চেয়ে বেশি শক্তিশালী :)


এটি আমার ভোট পায়, কারণ এটি পুরোপুরি শেল-অভ্যন্তরীণ; কোন কাঁটাচামচ প্রয়োজন।
esm

2
আপনি কোন কাঁটাচামচ উল্লেখ করছেন? আসল উত্তরের কোনও দরকার নেই। 'প্রিন্টফ টাইপ প্রিন্টফ' এর আউটপুট হ'ল প্রিন্টফ একটি শেল বিল্টিন 'এবং অতএব আসল বাশ প্রক্রিয়াতে চলে।
কোডগনোম

এটি কেবলমাত্র এক এতদূর (হয় yes, printf, for i in {1..5}) যে যদি nশূন্য হয়, এটা ফেরৎ খালি স্ট্রিং তুলনা জন্য গাণিতিক নোটেশন কারণে 1. এছাড়াও মর্যাদা অস্তিত্ব ছাড়া, এটি 1 পুষিয়ে আছে করা সহজ (পরিবর্তন করে যেমন <=করতে <)
মেহরাদ মাহমুদিয়ান

10

আপনি একটি কৌশল ব্যবহার করতে পারেন। একটি খালি ভেরিয়েবল প্রতিধ্বনি কিছুই মুদ্রণ করে না। সুতরাং আপনি লিখতে পারেন:

echo word$wojek{1..100}

যদি $wojek1 $wojek2... $wojek100অ-বিদ্যমান ভেরিয়েবল হয় তবে আপনি আপনার শব্দটি অন্য কোনও কিছু ছাড়াই 100 বার পুনরাবৃত্তি করতে পারবেন।


1
এটি একটি কুৎসিত কুরুচিপূর্ণ হ্যাক এবং তবুও আমি সহায়তা করতে পারি না তবে এটি ভালবাসি এবং এটি ব্যবহার করতে পারি।
16807

এটা ভালবাসা! এর $_পরিবর্তে ব্যবহার করা $wojekঅভিপ্রায়কে আরও পরিষ্কার করে দেয়।
মিহাই টডর

7

nবারবার পুনরাবৃত্তি করুন , এর n-1মধ্যে কমা দিন {}:

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

প্রথম প্রতিধ্বনির পরে দুবার 'হেলিওর্ল্ড' পুনরাবৃত্তি করে।


5
সুন্দর, তবে আমি যদি nকোনও ভেরিয়েবল থেকে পেতে চাই তবে কী হবে ?
getFree

1
এটি প্রতিটি '
হেলিওর্ল্ড

এটি আপনাকে স্ট্রিংয়ে
নিউলাইনগুলি

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

ফলাফল

হ্যালো হ্যালো হ্যালো হ্যালো

এটিকে জঞ্জাল ছাড়াই ব্যবহার করুন: যখন (সি ++ <5)); প্রিন্টফ 'হ্যালো' করুন; সম্পন্ন
emf

4

yesসমাধানের সাথে আমি নষ্ট পাইপের সতর্কতাগুলি ভোগ করেছি , সুতরাং এখানে আরও একটি ভাল বিকল্প রয়েছে:

$ seq 4 | sed "c foo"
foo
foo
foo
foo

3

@ পাইক ইঙ্গিত করছিল তার উপর ভিত্তি করে

স্ট্রিং ইকো স্ট্রিংয়ের প্রতিটি চরিত্রের জন্য

echo ${target//?/$replace}

=অক্ষরের সাথে আন্ডারলাইন করা শিরোনামের উদাহরণ

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

আউটপুট হবে

ABCDEF
======

এটি লিনাক্স এবং ওএস এক্সের মধ্যে বন্দর বলে মনে হয় এবং এটি আমাকে খুশি করে।

nJoy!


3

আপনি BSD এ থাকলে আপনি কেবল ব্যবহার করতে পারেন seq

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

1
ইন seq (GNU coreutils) 8.25, এটি দেয় seq: format 'Hello, world' has no % directive, একটি ফর্ম্যাটিং নির্দেশ উপস্থিত থাকতে বাধ্য করে। জিএনইউ কোর্টিলগুলি ব্যবহার করা হয় যেমন এন লিনাক্সের অনেকগুলি বিতরণ এবং সাইগউইন used এটি কেবল বিএসডি সিকিমে কাজ করে এমন তথ্য হারিয়ে যাওয়ার জন্য এখানে তথ্য সহ।
পেরেক


2

ধরে নিচ্ছি আপনি পার্লের 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}ব্যাশে লিখতে পারবেন না : পরিবর্তনশীল প্রতিস্থাপনের আগে ব্রেস সম্প্রসারণ করা হয়।


2

লিনাক্সে ঠিক অন্তর্নির্মিত নয়, তবে যদি আপনি পাইথন ইনস্টল করেন ..

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

অথবা একটি লাইনে, মন্তব্যকারীদের পরামর্শ অনুসারে:

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

4
আসলে এটি কার্যকর নয়, যেহেতু এটি সহজেই শেল স্ক্রিপ্টগুলিতে একীভূত করা যায় না ইত্যাদি এবং শেল নিজেই এটি করার জন্য প্রায় এক বিলিয়ন উপায় রয়েছে বলে আমি এর জন্য বড় বন্দুকগুলি (অর্থাত পাইথন) আনার সামান্য কারণ দেখি ।
অ্যাড্রিয়ান পেট্রেস্কু

7
আমি তোমার দ্বিতীয় বিন্দু সাথে একমত কিন্তু মুষ্টি ... এটি একটি শেল স্ক্রিপ্ট মধ্যে একীভূত করা সহজ: পাইথন -c 'ছাপি "। ইহা একটি টেস্ট \ N" * 10'
larsks

আমি এই সমাধানটির পঠনযোগ্যতা পছন্দ করি, আমার পক্ষে যথেষ্ট ভাল কারণ। ;)
ইলিয়াস

2

এখানে কোন যাদু নেই:

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


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.