দশমিক দশমিক ছয়টি অক্ষর মুদ্রণ করা, আমার কমান্ডটি ফলাফল হিসাবে আউটপুট দেয় না


14

আমি নিম্নলিখিত কমান্ড দিয়ে সমস্ত ascii অক্ষরের একটি স্ট্রুপ আউটপুট করতে চেয়েছিলাম

for i in `seq 32 127`; do printf "%c" $i; done

উপরের কমান্ডের আউটপুট হল:

33333334444444444555555555566666666667777777777..............

এটি প্রতিটি সংখ্যার প্রথম (বাম থেকে) অঙ্ক।

এই সাইটটির মাধ্যমে সন্ধান করে আমি আমার সমস্যার উত্তর পেয়েছি কীভাবে সি এল এলিতে সমস্ত মুদ্রণযোগ্য এএসসিআইআই অক্ষর মুদ্রণ করবেন? যাইহোক, আমি এখনও বুঝতে পারি না যে আমার আসল স্নিপেট কেন ascii অক্ষরকে উদ্দেশ্য হিসাবে আউটপুট দেয় না।


1
POSIX এই dictates, এখানে এর comp.unix.shellথ্রেড কেন এটা ডান জিনিস হচ্ছে সে বিষয়ে;)
sr_

@ এসআর_ থ্রেড দেখানোর জন্য ধন্যবাদ। এটির আমি ব্যাখ্যাটি খুঁজছিলাম।
ইফতিখান

উত্তর:


13

আপনি সরাসরি ব্যবহার করে আসকি কোডগুলি মুদ্রণ করতে পারবেন না printf "%c" $i সি তে পছন্দ মতো

আপনাকে প্রথমে i এর দশমিক মানটিকে তার অক্টাল মানতে রূপান্তর করতে হবে এবং তারপরে আপনাকে এটিকে তাদের নিজ নিজ আটকের মানগুলির সামনে printfরেখে মুদ্রণ করতে হবে \

মুদ্রণ করতে A, আপনাকে দশমিক 65 টি অষ্টাল, অর্থাৎ 101 এ রূপান্তর করতে হবে এবং তারপরে আপনাকে সেই অষ্টাল মানটি প্রিন্ট করতে হবে:

printf "\101\n"

এটি মুদ্রণ করবে A

সুতরাং আপনাকে এটিকে সংশোধন করতে হবে:

for i in `seq 32 127`; do printf \\$(printf "%o" $i);done;

তবে ব্যবহার করে awkআপনি সরাসরি সি ভাষার মতো মুদ্রণ করতে পারেন

awk 'BEGIN{for(i=32;i<=127;i++)printf "%c",i}';echo

7
ইন bashএবং zshএই লুপ ছাড়া ও বহিস্থিত কমান্ড ছাড়াই করা সম্ভব: printf $(printf '\%o' {32..127})
manatwork

@ মানাটওয়ার্ক: হ্যাঁ ঠিকই ... এটিকে নির্দেশ করার জন্য অনেক ধন্যবাদ ..
প্রদীপচেত্রি

1
@ প্রদীপচেত্রী: বিস্তারিত প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ এবং এটি বেশিরভাগ প্রয়োজনীয় বিবরণটি কভার করে বলে মনে হয়েছিল (তাই আমি আপনার উত্তরটি বেছে নিই)। তবে আমি অনুমান করি যে এটি ইউনিক্স.ডারকিলার . com/ নিউজগ্রুপস / কমম্প.ইনিক্স.শেল/2007-07/ … এ নিম্নলিখিত বার্তায় পাওয়া যাবে এমন একটি গুরুত্বপূর্ণ টুকরোগুলি বাদ দিয়েছে । এতে বলা হয়েছে যে "যুক্ত রূপান্তরকারী নির্দিষ্ট বি, সি, বা এস থাকলে যুক্তি সংযোজনকে স্ট্রিং হিসাবে বিবেচনা করা হবে ..."
ইফতিখান

(char)(127)ব্যাকস্পেস বা এর মতো কিছু নয় । এটি যাই হউক না কেন, এটি হ্যাক্স-বাক্সগুলির মধ্যে একটি হিসাবে প্রদর্শিত হয় বা যা তাদের বলা হয় whatever আপনি যদি কেবল "মুদ্রণযোগ্য" (অর্থাত্ পঠনযোগ্য) চান তবে কেবল 126 এ যান Also এছাড়াও, অষ্টালটি নিয়ে দুর্দান্ত চিন্তাভাবনা। এটাই চালাক; আমি হেক্সাডেসিমাল (যেমন printf '\x%x; {32..126}... বা 127 এর মতো বিবেচনা করছি), আমি অনুমান করি যেহেতু আপনারা সকলেই এটি করেছেন) তবে এটি কার্যকর হয় না। অষ্টাল দিন বাঁচায়! :) অবশেষে, @ ইফতিখান, আপনি কী বলতে চাইছেন তা আমি নিশ্চিত নই। awkপ্রায়শই সি-স্টাইল কমান্ড ব্যবহার করে এবং অন্য কোথাও %cব্যবহৃত হয় না। অষ্টাল সংখ্যা ব্যবহার করা এক-বাইট অক্ষর ব্যবহারের চেয়ে আলাদা।
ডিলান

3

%c সম্পর্কিত যুক্তিকে চর হিসাবে ব্যাখ্যা করে: প্রদত্ত আর্গুমেন্টের কেবলমাত্র প্রথম অক্ষরটিই মুদ্রিত হয়

এগুলি মুদ্রণের জন্য আপনার কাছে ইতিমধ্যে একটি উপায় রয়েছে বলে মনে হয় তবে এখানে একটি বৈকল্পিক।

for i in `seq 32 127`; do printf "\x$(printf "%x" $i) $i"; done

0

আপনার প্রয়োজন printf, তবে শুধুমাত্র একবার; আপনি একটি printfসহজ এবং আরও দক্ষ echoপ্লাস বাশ পালানোর সিকোয়েন্সগুলির দ্বারা একটি ব্যবহার প্রতিস্থাপন করতে পারেন :

ষড়যন্ত্রগুলি সহ:

for i in `seq 32 127`; do
  echo -ne \\x$(printf %02x $i)
done

অষ্টাল সহ:

for i in `seq 32 127`; do
  echo -ne \\0$(printf %03o $i)
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.