প্রিন্টফ কমান্ডটি ব্যবহার করে একটি অক্ষর এন টাইপ করা


12

লিনাক্সে একটি চরিত্র পুনরাবৃত্তি করতে আমি নিম্নলিখিত কমান্ডটি পেয়েছি:

printf 'H%.0s' {1..5000} > H.txt

আমি উদাহরণস্বরূপ, Hবার 5000বার পুনরাবৃত্তি করতে চান । %.0sএখানে মানে কি ?


সঙ্গে tcshবা zsh, repeat 5000 printf Hবুঝতে সহজ। সঙ্গে perl: print "H" x 5000(নোট যে {1..5000}একটি zsh দ্বারা অনুপ্রাণিত অপারেটর perls 'এর 1..5000এক এবং পরে ksh93 এবং ব্যাশ দ্বারা অনুলিপি করেছে)
Stéphane Chazelas

হ্যাঁ এটি কাজ করে তবে বৃহত্তর পুনরাবৃত্তির জন্য প্রচুর সংস্থান ব্যবহার করে, স্টাফেন চেজেলাসের পরামর্শগুলি অনুসরণ করুন
স্কেপেরেন

1
আমি এই আদেশটি করবyes H|head -5000|tr -d '\012'
স্কেপেরেন

dd if=/dev/zero bs=5000 count=1 | tr '\0' H
কোজিরো

@ স্কেপ্রেন:yes H| head -n 2500| tr \\n H
মাইকজার্ভ

উত্তর:


20

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

শেলটি প্রথম 5000 এর পুনরাবৃত্তি না হওয়া পর্যন্ত উত্পন্ন এইচএস মুদ্রণ করা যায় না, এই কমান্ডটি এইচএস এর printf সাথে সংখ্যার স্ট্রিং আর্গুমেন্টগুলি সংরক্ষণ এবং সীমিত করতে সমস্ত মেমরির জন্যও ব্যয় করে । ঠিক যেমন আপনি করতে পারেন:

printf %05000s|tr \  H

... যা 5000 টি স্পেসের একটি স্ট্রিং উত্পন্ন করে - যা সাধারণত কমপক্ষে কেবলমাত্র একক বাইট হয় এবং সীমানা ছাড়াই দাম ব্যয় করার জন্য কিছুই লাগে না। কয়েকটি পরীক্ষা নির্দেশ করে যে কাঁটাচামচের জন্য 5000 বাইটের জন্য এমনকি পাইপগুলির জন্য প্রয়োজনীয় trমূল্য এমনকি এই ক্ষেত্রে এমনকি এটি মূল্যবান এবং এটি যখন সংখ্যাটি বেশি হয় তখন প্রায় সর্বদা এটি হয়।

আমি দৌড়ে ...

time bash -c 'printf H%.0s {1..5000}' >/dev/null

...এবং...

time bash -c 'printf %05000s|tr \  H' >/dev/null

প্রতিটি প্রায় 5 বার একটি টুকরো (এখানে বৈজ্ঞানিক কিছুই নেই - কেবলমাত্র উপাখ্যানীয়) এবং ব্রেস সম্প্রসারণ সংস্করণ মোট প্রক্রিয়াকরণের সময়কালে .02 সেকেন্ডের চেয়ে একটু বেশি পেরিয়ে গেছে, তবে trসংস্করণটি গড়ে প্রায় .012 সেকেন্ডে এসেছিল - এবং trসংস্করণটি এটি পরাজিত করে প্রত্যেকবার. আমি অবাক হয়ে বলতে পারি না - {brace expansion}এটি একটি কার্যকর ইন্টারেক্টিভ শেল শর্টহ্যান্ড বৈশিষ্ট্য, তবে যেখানে কোনও ধরণের স্ক্রিপ্টিং সম্পর্কিত তা করার জন্য এটি সাধারণত একটি অপব্যয়ী জিনিস। সাধারণ ফর্ম:

for i in {[num]..[num]}; do ...

... যখন আপনি এটি সম্পর্কে চিন্তা, সত্যিই দুই for প্রথম অভ্যন্তরীণ ও যে কোনো না কোনোভাবে শেল আবশ্যক লুপ তাদের সবাইকে সংরক্ষণ এবং সেগুলি আপনার জন্য আবার iterating পূর্ববর্তীদের iterators উৎপন্ন করার জন্য উহ্য হয় - লুপ forলুপ। এই জাতীয় জিনিসগুলি সাধারণত ভালভাবে করা হয়:

iterator=$start
until [ "$((iterator+=interval))" -gt "$end" ]; do ...

... কারণ আপনি কেবলমাত্র খুব কম মান সংরক্ষণ করেন এবং পুনরাবৃত্তিগুলি তৈরি করার সময় পুনরাবৃত্তি করার পাশাপাশি সেগুলি ওভাররাইট করে।

যাইহোক, পূর্বে উল্লিখিত স্পেস প্যাডিংয়ের মতো, আপনি printfএকটি স্বেচ্ছাসেবী সংখ্যাও জিরোপ্যাড করতে ব্যবহার করতে পারেন , অবশ্যই:

printf %05000d

আমি উভয় যুক্তি ছাড়াই করি কারণ আর্গুমেন্টের printfফর্ম্যাট স্ট্রিংয়ে নির্দিষ্ট প্রতিটি আর্গুমেন্টের জন্য যখন কোনও আর্গুমেন্ট নাল স্ট্রিং ব্যবহার করা হয় না - যা কোনও অঙ্কের আর্গুমেন্টের জন্য শূন্য বা স্ট্রিংয়ের জন্য খালি স্ট্রিং হিসাবে ব্যাখ্যা করা হয়।

প্রশ্নের কমান্ডের সাথে তুলনা করার সময় এটি মুদ্রার অপর (এবং - আমার মতে - আরও দক্ষ) দিক - যখন আপনি printf %.0প্রতিটি যুক্তির জন্য স্ট্রিংয়ের দৈর্ঘ্য করেন তখন আপনি যেমন কিছু করেন তেমন কিছুই পাওয়া সম্ভব না , তাই এটিও হয় কিছুই থেকে কিছু পাওয়া সম্ভব।

আপনি ddযেমন ব্যবহার করতে পারেন প্রচুর পরিমাণে জেনারেট বাইটের জন্য দ্রুততর :

printf \\0| dd bs=64k conv=sync 

... এবং W / নিয়মিত ফাইল ddএর seek=[num]যুক্তি বৃহত্তর সুবিধা ব্যবহার করা যাবে। আপনি NULLs বদলে 64K নতুন লাইন পেতে পারেন যদি আপনি যোগ ,unblock cbs=1উপরে এবং থেকে সঙ্গে প্রতি লাইনে নির্বিচারে স্ট্রিং সেখানে উদ্বুদ্ধ পারে pasteএবং /dev/null- কিন্তু যে ক্ষেত্রে, যদি আপনার কাছে উপলব্ধ হয়, তাহলে আপনি হিসাবে ভাল ব্যবহার করতে পারেন:

yes 'output string forever'

ddযাইহোক এখানে আরও কয়েকটি উদাহরণ দেওয়া হল :

dd bs=5000 seek=1 if=/dev/null of=./H.txt

... যা 5000 টি বাইটের আকারের H.txt নামের বর্তমান ডিরেক্টরিতে একটি পূর্ণ ফাইল তৈরি করে (বা\0NUL ছাঁটাই করে)। ddসরাসরি অফসেটে সন্ধান করে এবং এর পিছনে NUL পূরণ করে।

<&1 dd bs=5000 conv=sync,noerror count=1 | tr \\0 H >./H.txt

... যা একই নাম এবং আকারের একটি ফাইল তৈরি করে তবে ডাব্লু / এইচ চর পূরণ করে। এটা তোলে সুবিধা নেয় ddএকটি পঠিত ত্রুটির ক্ষেত্রে অন্তত একটি পূর্ণ নাল-ব্লক আউট লেখার এর spec'd আচরণ যখন noerrorএবং syncধর্মান্তর উল্লিখিত (এবং - ছাড়া count=- সম্ভবত চেয়ে যদি আপনি চান পারে আর যেতে হবে) , এবং ইচ্ছাকৃতভাবে পুনঃনির্দেশ এ writeonly ফাইল বর্ণনাকারী ddএর stdin।


8

%.0sহিসেবে যুক্তি রূপান্তর মানে স্ট্রিং একটি সঙ্গে, স্পষ্টতা শূন্য হয়। অনুযায়ী man 3 printf, যেমন একটি ক্ষেত্রে যথার্থ মান দেয়

   [ ... ] the  maximum  number  of characters to be printed from a
   string for s and S conversions.

সুতরাং যখন যথার্থতা শূন্য হয় তখন স্ট্রিং আর্গুমেন্টটি কোনওভাবেই মুদ্রিত হয় না। তবে H(যা ফর্ম্যাট স্পেসিফায়ারের অংশ) আর্গুমেন্ট হিসাবে যতবার মুদ্রিত হবে, যেহেতু printfবিভাগের ধারা অনুযায়ীman bash

The format is reused as necessary to consume all  of  the  argu
ments.  If the format requires more arguments than are supplied,
the extra format specifications behave as if  a  zero  value  or
null  string,  as  appropriate,  had  been supplied. 

7

এই ক্ষেত্রে, %.0sসর্বদা তার আগে বর্ণের একটি উদাহরণ ছাপা হয়, এই ক্ষেত্রে এইচ। আপনি যখন {1..5000 use ব্যবহার করেন, শেলটি এটি প্রসারিত করে এবং এটি হয়ে যায়:

printf 'H%.0s' 1 2 3 4 ... 5000 > H.txt

যেমন, প্রিন্টফ কমান্ডের এখন 5000 টি আর্গুমেন্ট রয়েছে এবং প্রতিটি যুক্তির জন্য আপনি একটি এইচ পাবেন These এগুলি ক্রমিক বা সংখ্যাসূচক হতে হবে না:

printf 'H%.0s' a bc fg 12 34

প্রিন্ট HHHHH- অর্থাত্, এই ক্ষেত্রে 5 টি আর্গুমেন্ট।

দ্রষ্টব্য, উপরে 1 ম উদাহরণের উপবৃত্তগুলি আক্ষরিকভাবে সন্নিবেশ করা হয় নি, তারা একটি ক্রম বা ব্যাপ্তি নির্দেশ করার জন্য সেখানে রয়েছে।

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