কেন ইউনিট বিভাজক (ASCII 31) টার্মিনাল আউটপুটে অদৃশ্য?


17

ইউনিট বিভাজক ASCII অক্ষর (ASCII 31, অক্টাল 37), হিসাবে একটি হিসাবে ভিমে দৃশ্যমান ^_। তবে যদি আমি একই ফাইলটি টার্মিনালে মুদ্রণ করি তবে অক্ষরটি অদৃশ্য। এটি একটি লাইনের ক্ষেত্রগুলিকে একসাথে আটকে দেয়:

# In Vim and less:

first field^_second field^_last field

# cat the same file to terminal:
cat delim.txt
first fieldsecond fieldlast field

# print 2nd field with awk 
cat delim.txt | awk 'BEGIN {FS = "\037"} {print $2}'
second field

আমি মনে করি আমি ইউনিট বিভাজকটিকে বিড়াল -v দিয়ে দৃশ্যমান করতে পারি:

cat -v delim.txt
first field^_second field^_last field

তবে এটি বরং জটিল। বাশ শেলের স্টাডাউটে মুদ্রিত হওয়ার সময় কেন ইউনিট বিভাজকটির দৃশ্যমান উপস্থাপনা থাকবে না? আমি এমনকি শেল আউটপুট সঠিকভাবে অনুলিপি এবং কপি করতে পারি না; ইউনিট বিভাজক প্রক্রিয়া হারিয়ে যায়।


সমস্ত অক্ষর মুদ্রণযোগ্য নয়, ইউনিট বিভাজক এর মধ্যে একটি। কিছু সম্পাদক এটিকে সম্পাদনা সম্ভব করার জন্য এটি কোনও উপায়ে প্রদর্শন করবে। অস্পষ্টতা হ্রাস করার জন্য আপনাকে এটিকে প্রিন্টযোগ্য অক্ষরগুলির ক্রম এবং সম্ভবত একটি অন্য ফন্ট / রঙে অনুবাদ করতে হবে।
ctrl-alt-delor

3
31, এবং 127 এর নীচে ASCII কোডগুলি কোনও টার্মিনাল বা ডিভাইসকে কিছু করার কারণ হিসাবে তৈরি করেছে (সুতরাং এগুলিকে নিয়ন্ত্রণ কোড বলা হয়) বা কোনও প্রোটোকলে (EOT বা SOH এর মতো) কিছু দাঁড় করানোর উদ্দেশ্যে, কিছু প্রদর্শন করার বিরোধিতা করে। টার্মিনালগুলি টাইপ রাইটারের মতো ডিভাইস এবং গাড়িট-রিটার্নে একটি টেলি টাইপ বলার মতো জিনিসগুলির শারীরিক প্রয়োজন হওয়ার সময় এটি আবার শোনে। আপনি কোনও কিছু সম্পাদনা করছেন এবং কন্ট্রোল কোডগুলি যা জিজ্ঞাসা করছে তা করতে আসলেই টার্মিনালটি চান না সেজন্য সম্পাদকরা "^" স্বরলিপি ব্যবহার করে তাদের রেন্ডার করতে পছন্দ করতে পারে।
LawrenceC

1
@ লাওরেন্সসি: কোড 127 আসলে টার্মিনালটিকে কিছুই না করার কারণ ছিল, যদি কেউ কোনও টেপ খোঁচা মারছে এবং ভুল করে ফেলেছে তবে টেপটিকে ব্যাক আপ করার জন্য একটি বোতাম টিপে একটি জায়গা দিয়ে "ঘষে আউট" চাপবে, সমস্ত ঘুষি মারবে আটটি গর্ত পাঠক যখন সমস্ত ছিদ্রযুক্ত পাঞ্চযুক্ত চরিত্রের মুখোমুখি হন, তখন এটি তারের মাধ্যমে প্রেরণ করত তবে প্রাপক কেবল এটিকে উপেক্ষা করতে পারে।
সুপারক্যাট

উত্তর:


19

ইউনিট বিভাজক ( US) চরিত্র, নামেও পরিচিত IS1, হল cntrlচরিত্র শ্রেণী এবং না মধ্যে printচরিত্র শ্রেণী। এটি এমন একটি নিয়ন্ত্রণ চরিত্র যা গোষ্ঠীগুলিতে পাঠ্য সংগঠিত করার জন্য, সেই প্রোগ্রামগুলির জন্য যা সেই তথ্যটি ব্যবহারের জন্য ডিজাইন করা হয়েছিল । সাধারণভাবে, মুদ্রণযোগ্য অক্ষরগুলি সম্ভবত বিভিন্ন প্রোগ্রাম বা পরিবেশে আলাদাভাবে ব্যাখ্যা এবং রেন্ডার হতে চলেছে।

আপনি যে কারণটিকে এটিকে ^_ভিমে হিসাবে উপস্থাপন করছেন তা হ'ল ভিম একটি ইন্টারেক্টিভ সম্পাদক। এটি নিখরচায় প্রিন্টযোগ্য অক্ষরগুলি রেন্ডার করতে পারে তবে এটি চায়, যতক্ষণ না সঠিক বাইনারি চরিত্রটি ডিস্কে লেখা থাকে।

আপনি শেলের ক্ষেত্রে একই আচরণ পেতে পারবেন না কারণ ইউনিক্স শেল প্রোগ্রামগুলি অপারেটে চালনা করতে এবং একে অপরের কাছে সরল পাঠ্য প্রেরণে লেখা হয়। আপনি যখন catকোনও ফাইল করেন, টার্মিনালে লেখা পাঠ্যটি অবশ্যই ফাইলটিতে থাকা উচিত।

যাতে এটি অক্ষরটি ব্যাখ্যা করতে টার্মিনাল ডিভাইসে ফেলে যায়। এবং এটি সক্রিয় যে কিছু টার্মিনাল emulators না রেন্ডার USঅন্যদের থেকে ভিন্নভাবে অক্ষর। ইন gnome-terminal(অথবা কোন vteভিত্তিক টার্মিনাল), চরিত্র হেক্স কোড সহ একটি বক্স হিসাবে রেন্ডার হবে 001F। ইন xtermবা rxvt, চরিত্র প্রকৃতপক্ষে অদৃশ্য।


ওয়েল আমি বলবো না USহয় সম্পূর্ণই অদৃশ্য। আমি যখন সেই অক্ষরটি টার্মিনালে প্রবেশ করি Ctrl+/(এর মাধ্যমে নিশ্চিত হয়ে <C-v><C-/>) তখন এটি লাইনের একটি অনির্দিষ্ট পরিমাণ পাঠ্যকে মুছে দেয়। আমি এর আচরণটি পুরোপুরি বুঝতে পারি না, তবে এটির মূলত কিছুটা "বিপরীত ট্যাব" প্রভাব রয়েছে বলে মনে হচ্ছে যেখানে অনেকগুলি স্পেস সন্নিবেশ করানোর পরিবর্তে এটি বেশ কয়েকটি অক্ষর মুছে ফেলে তবে কখনও কখনও এটি এলোমেলোভাবে পাঠ্য সন্নিবেশ করে, তাই এটি বিভ্রান্তিকর হয় ।
ব্র্যাডেন সেরা

10

ইউনিট বিভাজক কন্ট্রোল অক্ষরের ASCII পরিসরে থাকে এবং সুতরাং (বা সাধারণত না হওয়া উচিত) এর চাক্ষুষ উপস্থাপনা থাকে না।

ভিম এবং অন্য কিছু সম্পাদক তাদের প্রদর্শন করে, যাতে আপনি তাদের সম্পাদনা করতে পারেন। যেমন আপনি লক্ষ্য করেছেন, cat -vএটিও প্রদর্শন করে। ম্যান পেজটি এটির -vসংক্ষিপ্ত রূপটি দেখায়, --show-nonprintingযার ফলে এটি মুদ্রণযোগ্য অক্ষরগুলিকে মুদ্রণযোগ্য উপস্থাপনার সাথে প্রতিস্থাপন করে, যা ফাইলটির মূল বিষয়বস্তু নয় এবং সুতরাং সমস্যার কারণ হতে পারে, যদি আউটপুট আসলে অন্য প্রোগ্রামে আসে ।

আপনি যে উপস্থাপনাটি দেখতে পান ইতোমধ্যে এটি একটি নিয়ন্ত্রণ চরিত্রের ইঙ্গিত দেয়: একটি দিয়ে অক্ষরযুক্ত একটি অক্ষর + অক্ষরটির ^একটি সাধারণ স্বরলিপি Ctrl, যা মূল সংমিশ্রণ যা এই টার্মিনালটিতে এই চরিত্রটি তৈরি করে। Ctrl+ _উদাহরণস্বরূপ, আপনাকে ইউনিট বিভাজক ইনপুট করতে দেয়। তবে অন্য সম্পাদক বা কিছু জিইউআই ভিউয়ার হেক্স কোড, একটি স্থানধারক বা সম্পূর্ণ আলাদা কিছু প্রদর্শন করতে পারে।

আপনার টার্মিনালটি যেমন নিয়ন্ত্রণ অক্ষরগুলি মুদ্রণ করে না, পাঠ্যটি নির্বাচন করার সময় এটি অনুলিপিও করা হয় না (নিউলাইন এবং ট্যাবের মতো সাদা বর্ণের অক্ষরগুলি এখানে একটি ব্যতিক্রম, যা নিয়ন্ত্রণের অক্ষরও খুব বেশি)। টার্মিনালে নিয়ন্ত্রণের অক্ষরের আরেকটি উদাহরণ যা সাধারণত অনুলিপি করার সময় উপেক্ষা করা হয় তা হ'ল বর্ণ কোডগুলি, যা ESCপাঠ্যকে রঙ করার জন্য কোড অনুসরণ করে একটি অক্ষর।

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


3

অন্যান্য (খুব ভাল) উত্তরের মার্জিনে কিছুটা হলেও, আপনি যদি ফাইলের সামগ্রী প্রদর্শন করার সময় কেবলমাত্র নিয়ন্ত্রণের চরিত্রটি পরিবর্তন করতে চান, তবে আপনি ইউটিলিটি (এবং ব্যাশ-সামঞ্জস্যপূর্ণ সিনট্যাক্সের কিছুটা) ব্যবহার করে অনুলিখন^_ করতে চাইতে পারেন :tr

# Replace the control character US (^_) by *one* other character
$ cat my.file | tr $'\c_' ':'

যদি আপনাকে সেই নিয়ন্ত্রণের চরিত্রটিকে তার "প্রসারিত" ফর্মের মাধ্যমে প্রতিস্থাপন করতে হয় তবে তার sedপরিবর্তে আপনার প্রয়োজন হবে:

# Replace the control character US (^_) by any string
cat /tmp/f | sed s/$'\c_'/^_/g

দয়া করে সিনট্যাক্সটি নোট করুন $'\cX': এই সিনট্যাক্সটি আপনার (বাশ-সামঞ্জস্যপূর্ণ শেল) সংশ্লিষ্ট নিয়ন্ত্রণ অক্ষরটি প্রতিস্থাপন করতে অবহিত করে। "ক্যারেট স্বরলিপি" ব্যবহার করে নিয়ন্ত্রণ অক্ষর ওরফে তালিকার জন্য উইকিপিডিয়া দেখুন । যদি আপনি এই বাক্য গঠনটি পছন্দ না করেন তবে আপনি তার পরিবর্তে অষ্টাল $'\037'বা হেক্সাডেসিমাল $'\x1f'স্বরলিপি ব্যবহার পছন্দ করতে পারেন ।

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