অন্য চরিত্রের সাথে স্ট্রিংয়ে প্যাডিং ট্রেলিং হোয়াইটস্পেসগুলি


12

আমি hello world20 টিরও বেশি অক্ষরের আউটপুট দিতে চাই ।

printf "%-20s :\n\n" 'hello world!!'

# Actual output
hello world!!        :

# Wanted output
hello world!!========:

যাইহোক, আমি ফাঁকা স্থানগুলি দিয়ে নয় বরং পরিবর্তে " = " দিয়ে পূর্ণ করতে চাই । আমি কেমন করে ঐটি করি?

উত্তর:


9

আরও সাধারণ সমাধান হতে আপডেট উত্তর। আরো দেখুন নীচের আমার অন্য উত্তর শুধুমাত্র শেল বক্রবন্ধনী বিস্তার এবং ব্যবহার pritnf

$ str='Hello World!'
$ sed -r ':loop; s/ (=*):$/\1=:/; t loop' <<< "$(printf '%-20s:\n' "$str" )"
Hello World!========:

কিভাবে এটা কাজ করে?

এটি (=*):$/একটি স্থান দখল করে, এক বা একাধিক =যা :তার ইনপুটটির শেষে একটি কোলন অনুসরণ করে ; আমরা =একটি গ্রুপ ম্যাচ হিসাবে সেট তৈরি এবং \1এটির ব্যাক-রেফারেন্স হবে।

সঙ্গে :loopআমরা একটি লেবেল নামে সংজ্ঞায়িত loopএবং t loopএটা সেই লেবেল একটি ঝাঁপ হবে s/ (=*):$/\1=:/সফল প্রতিস্থাপন করেছেন;

এর সাথে প্রতিস্থাপনের অংশে \1=:এটি সর্বদা =s এর সংখ্যা বাড়িয়ে দেবে এবং কোলনটি নিজেই স্ট্রিংয়ের শেষে ফিরে আসবে।


1
সুতরাং ইনপুটটিতে কত শব্দ আছে তার উপর নির্ভর করে আপনাকে পতাকাটি সামঞ্জস্য করতে হবে?
user1686

@ গ্রায়েটি আমি এখন আমার সাধারণ উত্তরগুলিতে উত্তর আপডেট করেছি।
αғsнιη

20
filler='===================='
string='foo'

printf '%s\n' "$string${filler:${#string}}"

দেয়

foo=================

${#string}মান দৈর্ঘ্য হল $string, এবং ${filler:${#string}}এর সাবস্ট্রিং হয় $fillerঅফসেট থেকে ${#string}অগ্রে।

আউটপুট এর মোট প্রস্থ হবে সর্বোচ্চ $fillerবা এর প্রস্থের $string

ফিলার স্ট্রিং, সিস্টেমগুলিতে jot, গতিশীলভাবে ব্যবহার করে তৈরি করা যেতে পারে

filler=$( jot -s '' -c 16 '=' '=' )

( =এক লাইনে 16 এর জন্য )। জিএনইউ সিস্টেমগুলি ব্যবহার করতে পারে seq:

filler=$( seq -s '=' 1 16 | tr -dc '=' )

অন্যান্য সিস্টেমগুলি পার্ল বা গতিশীলভাবে স্ট্রিং তৈরির কিছু দ্রুত উপায় ব্যবহার করতে পারে।


যে printfফিল্টারটি প্রায় সমস্ত সিস্টেমে পাওয়া যায় এবং শাঁসের সাথে ব্রেস প্রসারিত হয় তা কেন জেনারেট না করে bash/szh?
нιηসнιη

@ sddgob আপনি কীভাবে এটি printf+ ব্রেস সম্প্রসারণের মাধ্যমে করবেন bash?
কুসালানন্দ


17
printf "%.20s:\n\n" "$str========================="

%.20sস্ট্রিং কাটানো বিন্যাসটি কোথায়


2
এটি আইএমএইচও, আমার থেকে ভাল সমাধান। এটির জন্য কেবল বিন্যাসের স্ট্রিংয়ের একটি সংক্ষিপ্ত ব্যাখ্যা প্রয়োজন।
কুসালানন্দ

12

এটি করার একটি উপায়:

printf "====================:\r%s\n\n" 'hello world!!'

6
হা! এটা একটা চালাক কৌশল! তবে এটি প্রকৃতপক্ষে মুদ্রণ করবে ====================\rhello worldযা ওপিকে এটি কেবল স্ক্রিনে মুদ্রণ না করে প্রয়োজন হলে এটি একটি সমস্যা হতে পারে।
টেরডন

এছাড়াও echo -e '=================\rHello World!!', তবে @ ইটারডন ইঙ্গিত করে বলে একই সমস্যা রয়েছে।
нιηসнιη

1
@ .sнιη কেবল যদি echoসমর্থন করে -eprintfপ্রায় সবসময়ই echoঅনেক কারণের চেয়ে ভাল ।
সাটা কাটসুরা

5

একটি পার্ল পদ্ধতির:

$ perl -le '$k="hello world!!"; while(length($k)<20){$k.="=";} print "$k\n"'
hello world!!=======

বা আরও ভাল, @ স্যাটোক্যাটসুরা মন্তব্যগুলিতে উল্লেখ করেছেন:

perl -le '$k = "hello world!!"; print $k, "=" x (20-length $k), "\n"'

আপনার যদি ইউটিএফ মাল্টি-বাইট অক্ষর সমর্থন করার প্রয়োজন হয়, ব্যবহার করুন:

PERL_UNICODE='AS' perl -le '$k = "hello world!!"; print $k, "=" x (20-length $k), "\n"'

শেলের মধ্যে একই ধারণা:

v='hello world!!'; while [ ${#v} -lt 20 ]; do v="$v""="; done; printf '%s\n\n' "$v"

আপনি একটি লুপ প্রয়োজন হবে না: perl -le '$k = "hello world!!"; print $k, "=" x (20-length $k), "\n"'। তবে মাল্টি-বাইট অক্ষর জড়িত থাকলে এটি (এবং এখনও অবধি পোস্ট হওয়া সমস্ত সমাধান) ব্রেক হয়ে যায়।
স্যাট কাটসুরা

@ স্যাটাক্যাটসুর ওহ, হ্যাঁ, এটি পরিষ্কার! ধন্যবাদ, মনে করা উচিত। এবং হ্যাঁ, আমি ইউটিএফ মাল্টি-বাইট চরিত্রগুলিতে সম্ভাব্য ব্যর্থতার জন্য একটি দাবি অস্বীকার করার কথা ভাবছিলাম, তবে অনুভব করেছি যে এটি এই প্রসঙ্গে একটি অযথা জটিলতা হবে।
টেরডন

আমি মনে perl6করি এটি মাল্টি-বাইট অক্ষর সহ সঠিকভাবে করার একটি উপায় থাকতে পারে। তবে অন্যদিকে perl6অনেক উপায়ে বিরক্তিকর।
স্যাট কাটসুরা

@ স্যাটাক্যাটসুর ভাল, এই ধরণের সরল জিনিসটির জন্য, এটি ঠিক করা যথেষ্ট হবে PERL_UNICODE='AS'। উদাহরণস্বরূপ: printf '%s' nóóös | perl -nle 'print length($_)'8 ("ভুল") printf '%s' nóóös | PERL_UNICODE='AS' perl -nle 'print length($_)'প্রিন্ট করে 5 টি ("সঠিক") প্রিন্ট করে।
টেরডন

5

অন্য উপায়টি কেবল printfকমান্ড ব্যবহার করে প্রথমে অক্ষর প্যাডিং প্যাটার্ন তৈরি করে Shell Brace Expansion(আপনি মুদ্রণ করতে চান এমন একটি সংখ্যা ≥ ফর্ম্যাটিং এরিয়া দিয়ে শেষ করতে পারেন {1..end}) এবং কেবলমাত্র প্রতিটি প্রথম অক্ষর %.1sযা =s এবং তারপরে কেবল প্রথম 20 অক্ষরের দৈর্ঘ্য মুদ্রণ করুন যে অঞ্চল %.20s। অক্ষরের পরিবর্তে বারবার অক্ষর / শব্দ রাখার এটি এক ধরণের ভাল উপায়।

printf '%.20s:\n' "$str$(printf '%.1s' ={1..20})"
Hello World!!=======:

ব্যাখ্যা:

সাধারণত ব্রেস এক্সপেনশন হিসাবে শেল প্রসারিত {1..20}হয় যদি আমরা সেগুলি প্রিন্ট করি তবে নীচে হিসাবে শেল প্রসারিত হবে ।

printf '%s ' {1..20}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

এটিতে একটি সমান চিহ্ন যোগ করার সাথে সাথে ={1..20}শেলটি নিম্নলিখিত হিসাবে প্রসারিত হবে।

printf '%s ' ={1..20}
=1 =2 =3 =4 =5 =6 =7 =8 =9 =10 =11 =12 =13 =14 =15 =16 =17 =18 =19 =20 

এবং printf '%.1s'যা আসলে মাধ্যম printf '%WIDE.LENGTH', আমরা কেবল এক মুদ্রণ করছে LENGTH এর ডিফল্ট সাথে উপরে এ ঐ 1 ওয়াইড । সুতরাং কেবলমাত্র ফলাফল হবে =এবং 20 বার নিজেই পুনরাবৃত্তি হবে।

এখন printf '%.20s:\n'আমরা কেবল 20 দৈর্ঘ্য $strএবং $str<20 দৈর্ঘ্যের প্রিন্ট করছি , বাকী =স্থানগুলি পরিবর্তে উত্পন্ন এস থেকে নেওয়া হবে ।

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