टीएबी द्वारा अलग किए गए तार को कैसे प्रिंट करें?


9

मैं एक TAB द्वारा अलग किए गए दो स्ट्रिंग को प्रिंट करने का प्रयास कर रहा हूं। मैंने कोशिश की है:

echo -e 'foo\tbar'
printf '%s\t%s\n' foo bar

दोनों का प्रिंट:

foo     bar

जहां दोनों के बीच व्हाट्सएप वास्तव में 5 स्थान है (पुट्टी में माउस के साथ आउटपुट का चयन करने के अनुसार)।

मैंने CTRL + V का उपयोग करने का प्रयास किया है और कमांड टाइप करते समय TAB को दबाया है, उसी परिणाम के साथ।

टैब को टैब के रूप में मुद्रित करने के लिए बाध्य करने का सही तरीका क्या है, इसलिए मैं आउटपुट का चयन कर सकता हूं और इसे टैब के साथ कहीं और कॉपी कर सकता हूं?

और माध्यमिक प्रश्न: बैश अंतरिक्ष में टैब का विस्तार क्यों कर रहा है?

अद्यतन : जाहिर है, यह पोटीन की समस्या है: /superuser/656838/how-to-make-putty-display-tabs-within-a-file-instead-of-changing-them-to -spaces



सिर्फ इससे बचकर क्यों नहीं? printf '%s\\t%s\n' foo bar
वैलेंटाइन बजरमी

@steeldriver धन्यवाद कि मैं क्या जरूरत के समान है, लेकिन अंत में कोई समाधान नहीं है ...
Asu

1
@Valentin जो आउटपुट देता है foo\tbar...
wjandrea

1
इस तथ्य के बावजूद कि आप पहले से ही जानते हैं कि आपके पास अपने टर्मिनल के साथ एक मुद्दा है: बैश द्वारा स्वयं $'\t'टैब्युलेटर के रूप में व्याख्या करता है। तो आप हमेशा इस तरह से तार लगा सकते हैं - उदाहरण के लिए असाइनमेंट के रूप में: v='This is'$'\t''a test'और इसका प्रिंट शाब्दिक रूप से, उदाहरण के लिएprintf '%s' "$v"
rexkogitans

जवाबों:


9

जैसे इल्काचू ने कहा, यह बैश के साथ एक मुद्दा नहीं है, लेकिन टर्मिनल एमुलेटर के साथ जो आउटपुट पर टैब को धर्मान्तरित करता है।

अलग-अलग टर्मिनलों, पुट्टी, एक्सटर्म और कोनोलाज़ की जाँच करना, टैब को रिक्त स्थान में परिवर्तित करता है, जबकि urxvt और gnome-terminal नहीं। तो, एक और उपाय टर्मिनलों को स्विच करना है।


3
यह आपके द्वारा चलाए जाने के बाद भी tty ड्राइवर द्वारा किया जा सकता है stty tab3
स्टीफन चेज़लस

14

दोनों के बीच व्हाट्सएप वास्तव में 5 रिक्त स्थान है।

नहीं यह नहीं। echoया के आउटपुट में नहीं printf

$ echo -e 'foo\tbar' | od -c
0000000   f   o   o  \t   b   a   r  \n
0000010

टैब को टैब के रूप में मुद्रित करने के लिए बाध्य करने का सही तरीका क्या है, इसलिए मैं आउटपुट का चयन कर सकता हूं और इसे टैब के साथ कहीं और कॉपी कर सकता हूं?

यह एक अलग मुद्दा है। यह शेल के बारे में नहीं है बल्कि टर्मिनल एमुलेटर है, जो टैब को आउटपुट पर स्पेस में परिवर्तित करता है। कई, लेकिन उनमें से सभी ऐसा नहीं करते हैं।

किसी फ़ाइल में टैब के साथ आउटपुट को पुनर्निर्देशित करना आसान हो सकता है, और इसे वहां से कॉपी कर सकते हैं, या unexpandआउटपुट को टैब में बदलने के लिए आउटपुट पर उपयोग कर सकते हैं। (हालांकि यह भी पता नहीं चल सकता है कि व्हाट्सएप किसके साथ शुरू होना था, और अगर संभव हो तो यह सभी को टैब में बदल देगा।) बेशक यह इस बात पर निर्भर करेगा कि वास्तव में, आपको आउटपुट के साथ क्या करना है।


मेरा मतलब था कि जब मैं आउटपुट का चयन करने की कोशिश करता हूं, तो इसे 5 रिक्त स्थान माना जाता है। कमांड आउटपुट की सामग्री को सत्यापित करने के लिए 'od -c' के लिए धन्यवाद।
आसू

1
@ मुझे लगता है कि वह समझता है कि। उसका समाधान अन्य साधनों के माध्यम से आउटपुट प्राप्त करना है क्योंकि टर्मिनल एमुलेटर को टैब के रूप में छोड़ने की गारंटी नहीं है जब आप उन्हें विंडो में चुनते हैं। हालाँकि, मैंने अभी-अभी जाँच की और पोटीन, एक्सटर्म, और कोनोलास को टैब से रिक्त स्थान में परिवर्तित करते हैं, urxvt और gnome-terminal नहीं। तो, एक और उपाय टर्मिनलों को स्विच करना है।
JoL

@JoL हाँ, यह निष्कर्ष मैं अभी एक मिनट पहले आया था, और मुझे लगता है कि यह स्वीकृत उत्तर होगा यदि कोई इसे इस तरह पोस्ट करने की परवाह करता है ...
Asu

1
@, हाँ, मैंने इस मुद्दे पर मैन्युअल रूप से काम करने के बारे में सोचा। ऐसा करना कष्टप्रद होगा, लेकिन फिर मैं मानता हूं कि मुझे एहसास नहीं था कि टर्मिनल इम्यूलेटर हैं जो कॉपी किए गए टैब का समर्थन करते हैं। एक करने के लिए बदल रहा है, निश्चित रूप से एक बेहतर समाधान होगा!
ilkachachu

4

में printf '%s\t%s\n' foo bar, printfआउटपुट करता है foo<TAB>bar<LF>

f, o, b, aऔर rएकल-चौड़ाई चित्रमय अक्षर हैं।

उन वर्णों को प्राप्त करने पर, टर्मिनल एक समान ग्लिफ़ को प्रदर्शित करेगा और कर्सर को एक कॉलम को दाईं ओर ले जाएगा, जब तक कि यह स्क्रीन के दाहिने किनारे (मूल टेली-टाइपराइटर में कागज) तक नहीं पहुंच जाता है, जिस स्थिति में यह एक पंक्ति को खिला सकता है। और स्क्रीन के बाएं किनारे पर वापस जाएं (लपेटें) या टर्मिनल के आधार पर चरित्र को त्यागें और इसे कैसे कॉन्फ़िगर किया गया है।

<Tab>और <LF>दो नियंत्रण वर्ण हैं। <LF>(उर्फ न्यूलाइन) यूनिक्स पाठ में लाइन सीमांकक है, लेकिन टर्मिनलों के लिए, यह सिर्फ एक पंक्ति को खिलाती है (कर्सर को एक स्थिति नीचे ले जाएं)। तो कर्नेल में टर्मिनल ड्राइवर वास्तव में इसे <CR>(स्क्रीन के बाएं किनारे पर वापस), <LF>(कर्सर नीचे) ( stty onlcrआम तौर पर डिफ़ॉल्ट रूप से) में अनुवाद करेगा।

<Tab> कर्सर को अगले टैब स्टॉप पर ले जाने के लिए कहता है (जो कि अधिकांश टर्मिनलों पर डिफ़ॉल्ट रूप से अलग-अलग 8 स्थिति हैं, लेकिन रिक्त स्थान को भरने के बिना) को कहीं भी सेट करने के लिए कॉन्फ़िगर किया जा सकता है।

इसलिए यदि उन वर्णों को टैब के साथ टर्मिनल पर भेजा जाता है, तो हर 8 कॉलम बंद हो जाते हैं, जबकि कर्सर एक खाली लाइन की शुरुआत में होता है, जिसके परिणामस्वरूप:

foo     bar

उस लाइन पर स्क्रीन पर मुद्रित। यदि उन्हें भेज दिया जाता है जबकि कर्सर एक पंक्ति में तीसरे स्थान पर होता है xxxxyyyyzzzz, जिसमें परिणाम होगा:

xxfooyyybarz

उन टर्मिनलों पर जो सारणीकरण का समर्थन नहीं करते हैं, टर्मिनल चालक को उन टैब को रिक्त स्थान के अनुक्रम में अनुवाद करने के लिए कॉन्फ़िगर किया जा सकता है। ( stty tab3)।

मूल टेली-टाइपराइटर में SPC वर्ण, कर्सर को दाईं ओर \bले जाएगा , जबकि बैकस्पेस ( ) इसे बाईं ओर ले जाएगा। अब आधुनिक टर्मिनलों में, एसपीसी दाईं ओर ले जाता है और मिटा भी देता है (एक अंतरिक्ष चरित्र लिखता है जैसा कि आप उम्मीद करेंगे)। इसलिए लटकन को \bASCII की तुलना में कुछ नया होना चाहिए था। सबसे आधुनिक टर्मिनल पर, यह वास्तव में वर्णों का एक क्रम है: <Esc>, [, C

nस्क्रीन पर किसी भी स्थिति में बाएं, दाएं, ऊपर, नीचे या किसी भी स्थान पर ले जाने के लिए अधिक एस्केप सीक्वेंस हैं। स्क्रीन के लाइनों या क्षेत्रों के हिस्सों (खाली करने के साथ भरने) के अन्य भागने के अनुक्रम हैं, आदि।

उन दृश्यों को आम तौर पर की तरह दृश्य अनुप्रयोगों के द्वारा उपयोग किया जाता है vi, lynx, mutt, dialogजहां पाठ स्क्रीन पर मनमाने ढंग से स्थानों पर लिखा है।

अब, सभी X11 टर्मिनल एमुलेटर और कुछ अन्य गैर- X11 जैसे GNU screenआपको कॉपी पेस्ट के लिए स्क्रीन के क्षेत्रों का चयन करने देते हैं। जब आप viसंपादक में जो कुछ भी देखते हैं उसका एक हिस्सा चुनते हैं , तो आप उस आउटपुट को उत्पन्न करने के लिए उपयोग किए गए सभी एस्केप अनुक्रमों को कॉपी नहीं करना चाहते हैं। आप अपने द्वारा देखे गए पाठ का चयन करना चाहते हैं।

उदाहरण के लिए यदि आप चलाते हैं:

printf 'abC\rAC\bB\t\e[C\b\bD\n'

कौन सा एक संपादक सत्र जहाँ आप में प्रवेश simulates abC, शुरुआत के लिए वापस जाओ, की जगह abके साथ AC, Cके साथ B, अगले टैब स्टॉप के लिए, एक और स्तंभ सही करने के लिए, दो कॉलम बाईं ओर, चाल तो तो फिर enter D

आप समझ सकते हैं:

ABC    D

वह है, ABCएक 4 कॉलम गैप और D

यदि आप चयन करते हैं कि माउस के साथ xtermया putty, वे चयन में संग्रहीत करेंगे ABC, 4 अंतरिक्ष वर्ण और D, नहीं abC<CR>AC<BS>B<Tab><Esc>[C<BS><BS>D

चयन में जो समाप्त होता है वह printfटर्मिनल चालक और टर्मिनल एमुलेटर दोनों द्वारा पोस्ट-प्रोसेस्ड द्वारा भेजा गया है।

अन्य प्रकार के परिवर्तन के लिए, <U+0065><U+0301>( eतीव्र उच्चारण के संयोजन के बाद) को <U+00E9>( éपूर्व-निर्मित रूप) से बदलकर देखें xterm

या echo abcकि ABCटर्मिनल ड्राइवर द्वारा अनूदित होने के बाद टर्मिनल पर भेजने से पहले समाप्त हो जाता है stty olcuc

अब, <Tab>जैसे <LF>कि उन कुछ नियंत्रण वर्णों में से एक है जो वास्तव में कभी-कभी पाठ फ़ाइलों ( <CR>MSDOS पाठ फ़ाइलों में और कभी-कभी <FF>पृष्ठ विराम के लिए भी) में पाए जाते हैं ।

तो कुछ टर्मिनल एमुलेटर कॉपी-पेस्ट बफ़र्स में उन्हें संरक्षित करने के लिए जब संभव हो तो उन्हें कॉपी करने का चयन करते हैं (यह आमतौर पर न तो मामला है <CR>और न <LF>ही)।

उदाहरण के लिए, VTE- आधारित टर्मिनलों में gnome-terminal, आप देख सकते हैं कि, जब आप printf 'a\tb\n'एक खाली लाइन पर आउटपुट का चयन करते हैं , तो gnome-terminalवास्तव a\tbमें X11 चयन में a7 रिक्त स्थान और के बजाय स्टोर होता है b

लेकिन के उत्पादन के लिए printf 'a\t\bb\n', यह भंडार a, 6 रिक्त स्थान और b, और के लिए printf 'a\r\tb\n', a7 रिक्त स्थान और b

ऐसे अन्य मामले हैं जहां टर्मिनल वास्तविक इनपुट को कॉपी करने की कोशिश करेंगे, जैसे कि जब आप दौड़ने के बाद दो लाइनों का चयन करते हैं तो printf 'a \nb\n'उस अदृश्य अनुगामी स्थान को संरक्षित किया जाएगा। या दो पंक्तियों का चयन करते समय एक LF वर्ण शामिल नहीं होता है जब दो पंक्तियों का परिणाम सही मार्जिन पर लपेटने से होता है।

अब, अगर आप printfCLIPBOARD के आउटपुट को X11सेलेक्ट करना चाहते हैं, तो सबसे अच्छा यह है कि आप इसे सीधे पसंद करें:

printf 'foo\tbar\n' | xclip -sel c

ध्यान दें कि जब आप उस xtermया अधिकांश अन्य टर्मिनलों को पेस्ट करते हैं, तो xtermवास्तव में वह बदल देता है क्योंकि इसके \nसाथ \rही वह चरित्र xtermभेजता है जब आप दबाते हैं Enter(और टर्मिनल चालक इसे वापस अनुवाद कर सकता है \n)।


यह बहुत ही व्यावहारिक है, धन्यवाद। मैंने एक्सक्लूसिव समाधान की कोशिश की है और यह काम करता है। लेकिन यह बिल्कुल वैसा नहीं है जैसा मेरे दिमाग में था और इसके लिए X11 की आवश्यकता थी। हो सकता है कि यह कुछ बिंदु पर काम आए, धन्यवाद!
आसू

@ या, X11वह है जो यूनिक्स में xtermया जैसे टर्मिनल एमुलेटर में कॉपी-पेस्ट चयन को संभालता है putty। अन्य टर्मिनल एमुलेटरों में उनके पास कॉपी-पेस्ट तंत्र और वहां मनमाने ढंग से सामग्री स्टोर करने के तरीके हो सकते हैं, जैसे कि GNU स्क्रीन में readbuf और registerकमांड।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.