टर्मिनल आउटपुट में यूनिट सेपरेटर (ASCII 31) अदृश्य क्यों है?


17

यूनिट सेपरेटर ASCII कैरेक्टर (ASCII 31, ऑक्टल 37), Vim में a के रूप में दिखाई देता है ^_। लेकिन अगर मैं उसी फ़ाइल को टर्मिनल पर प्रिंट करता हूं, तो चरित्र अदृश्य है। यह एक लाइन पर खेतों को एक साथ फंसने का कारण बनता है:

# 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 के तहत ASCII कोड, और 127, का उद्देश्य कुछ करने के लिए एक टर्मिनल या डिवाइस के कारण होता है (इसलिए उन्हें नियंत्रण कोड कहा जाता है), या किसी प्रोटोकॉल में कुछ के लिए खड़े रहें (जैसे ईओटी या एसओएच), जैसा कि कुछ प्रदर्शित करने के लिए विरोध किया जाता है। यह सुनता है कि जब टर्मिनल टाइपराइटर जैसे उपकरण थे और कैरिज-कैरिज के लिए एक टेलेटाइप बताने जैसी चीजें शारीरिक रूप से आवश्यक थीं। संपादकों ने उन्हें "^" नोटेशन का उपयोग करके रेंडर करने का विकल्प चुन सकते हैं क्योंकि आप कुछ संपादित कर रहे हैं और वास्तव में नियंत्रण कोड से पूछ रहे हैं कि क्या करना चाहते हैं।
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+ _आप इनपुट vim में इकाई विभाजक, उदाहरण के लिए करने देगा। लेकिन एक अन्य संपादक या कुछ GUI दर्शक हेक्स कोड, एक प्लेसहोल्डर या कुछ पूरी तरह से अलग दिखा सकते हैं।

जैसा कि आपका टर्मिनल नियंत्रण वर्णों को प्रिंट नहीं करता है, यह पाठ का चयन करते समय भी कॉपी नहीं किया जाता है (व्हाट्सएप वर्ण जैसे कि न्यूलाइन और टैब यहां अपवाद हैं, जो नियंत्रण वर्ण भी हैं)। टर्मिनल में नियंत्रण वर्णों का एक और उदाहरण जो आमतौर पर कॉपी किए जाने पर अनदेखा 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'नोटेशन का उपयोग करना पसंद कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.