ব্যাশে টিএবি দ্বারা পৃথক স্ট্রিংগুলি কীভাবে মুদ্রণ করা যায়?


9

আমি একটি ট্যাব দ্বারা পৃথক দুটি স্ট্রিং মুদ্রণের চেষ্টা করছি। আমি চেষ্টা করেছি:

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

উভয়ই মুদ্রণ:

foo     bar

যেখানে দুজনের মধ্যে শ্বেত স্পেসটি আসলে 5 টি স্পেস (পুট্টিতে মাউস দিয়ে আউটপুট নির্বাচন করার ক্ষেত্রে)।

একই ফলস্বরূপ, কমান্ডটি টাইপ করার সময় আমি সিটিআরএল + ভি ব্যবহার করে এবং টিএবি টিপতে চেষ্টা করেছি।

ট্যাবটিকে ট্যাব হিসাবে মুদ্রিত করার সঠিক উপায় কী, তাই আমি আউটপুটটি নির্বাচন করতে এবং এটি ট্যাব সহ অন্য কোথাও অনুলিপি করতে পারি?

এবং দ্বিতীয় প্রশ্ন: বাশ কেন ফাঁকা জায়গায় ট্যাবগুলি প্রসারিত করছে?

আপডেট : আপাতদৃষ্টিতে, এটি পুট্টির একটি সমস্যা: https://superuser.com -spaces



কেন শুধু এটিকে পালানো যায় না? printf '%s\\t%s\n' foo bar
ভ্যালেন্টিন বজরামি

@ স্টিল্ড্রাইভার ধন্যবাদ যা আমার প্রয়োজনের সাথে অনেকটা সমান, তবে শেষ পর্যন্ত কোনও সমাধান হয় না ...
আসু

1
@ ভ্যালেন্টিন যে আউটপুট foo\tbar...
wjandrea

1
এই বিষয়টি সত্ত্বেও আপনি ইতিমধ্যে জানেন যে আপনার টার্মিনাল নিয়ে আপনার একটি সমস্যা রয়েছে: বাশ নিজেই $'\t'ট্যাবুলেটার হিসাবে ব্যাখ্যা করে । সুতরাং আপনি সর্বদা এর মতো স্ট্রিংগুলি v='This is'$'\t''a test'printf '%s' "$v"
কনকেনেট

উত্তর:


9

যেমন ইল্কাচ্চু বলেছিলেন, এটি ব্যাশের কোনও সমস্যা নয়, টার্মিনাল এমুলেটর যা ট্যাবগুলিকে আউটপুট স্পেসে রূপান্তর করে।

বিভিন্ন টার্মিনাল, পুটি, এক্সটারম, এবং কনসোল পরীক্ষা করে ট্যাবগুলিকে স্পেসে রূপান্তর করে, যখন urxvt এবং gnome- টার্মিনাল করে না। সুতরাং, আরেকটি সমাধান হ'ল টার্মিনালগুলি স্যুইচ করা।


3
এটি আপনি চালানোর পরে tty ড্রাইভার দ্বারাও করা যেতে পারে stty tab3
স্টাফেন চেজেলাস

14

দুজনের মধ্যে সাদা জায়গাটি আসলে 5 টি স্পেস s

না এইটা না. echoবা আউটপুট না printf

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

ট্যাবটিকে ট্যাব হিসাবে মুদ্রিত করার সঠিক উপায় কী, তাই আমি আউটপুটটি নির্বাচন করতে এবং এটি ট্যাব সহ অন্য কোথাও অনুলিপি করতে পারি?

এটি একটি ভিন্ন বিষয়। এটি শেল সম্পর্কে নয় তবে টার্মিনাল এমুলেটর, যা ট্যাবগুলিকে আউটপুট স্পেসে রূপান্তর করে। অনেক, কিন্তু তাদের সবাই তা করে না।

কোনও ফাইলের সাথে ট্যাবগুলি সহ আউটপুট পুনর্নির্দেশ করা এবং সেখান থেকে অনুলিপি করা বা unexpandস্পেসগুলি ট্যাবগুলিতে রূপান্তর করতে আউটপুট ব্যবহার করা সহজ হতে পারে । (যদিও এটিও জানতে পারে না যে শ্বেত স্পেসটি ট্যাবগুলি কী দিয়ে শুরু করা হয়েছিল, এবং এটি সম্ভব হলে এটিগুলির সমস্তগুলি ট্যাবে রূপান্তরিত করবে)) অবশ্যই এটি নির্ভর করবে আউটপুটটির সাথে আপনাকে কী করা দরকার।


আমি বোঝাতে চাইছি যে আমি যখন আউটপুটটি নির্বাচন করার চেষ্টা করব তখন এটি 5 টি স্পেস হিসাবে বিবেচিত হবে। কমান্ড আউটপুটটির বিষয়বস্তু যাচাই করতে 'od -c' এর জন্য ধন্যবাদ।
আসু

1
@ আসু আমার ধারণা তিনি এটি বুঝতে পেরেছেন। তার সমাধানটি হ'ল অন্য উপায়ের মাধ্যমে আউটপুট পাওয়া যেহেতু টার্মিনাল এমুলেটর যখন আপনি উইন্ডোতে নির্বাচন করেন তখন ট্যাব হিসাবে ট্যাবগুলি রাখার নিশ্চয়তা নেই। যাইহোক, আমি ঠিক পরীক্ষা করেছি এবং পুটি, এক্সটার্ম এবং কনসোল ট্যাবগুলিকে স্পেসে রূপান্তর করে, urxvt এবং জিনোম-টার্মিনাল দেয় না। সুতরাং, আরেকটি সমাধান হ'ল টার্মিনালগুলি স্যুইচ করা।
জোল

@ জোল হ্যাঁ, এই সিদ্ধান্তটি আমি মাত্র এক মিনিট আগে এসেছি এবং আমি মনে করি যে কেউ যদি এটির মতো পোস্ট করতে আগ্রহী তবে এটি গ্রহণযোগ্য উত্তর হবে ...
আসু

1
@ আসু, হ্যাঁ, আমি নিজেই ইস্যুটি হাতে নিয়ে কাজ করার কথা ভেবেছিলাম। এটি করা বিরক্তিকর হবে তবে আমি স্বীকার করেছিলাম যে টার্মিনাল এমুলেটর রয়েছে যা অনুলিপি ট্যাবগুলিকে সমর্থন করে। যে একটিতে পরিবর্তন করা অবশ্যই আরও অনেক ভাল সমাধান হতে পারে!
ilkkachu

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 পজিশনের বাইরে থাকে তবে কোথাও সেট করার জন্য কনফিগারও করা যায়) to

সুতরাং যদি কার্সারটি খালি লাইনের শুরুতে ট্যাব সহ প্রতিটি 8 টি কলাম থামিয়ে ট্যাব সহ যদি এই অক্ষরগুলি পাঠানো হয়, এর ফলস্বরূপ:

foo     bar

সেই লাইনে স্ক্রিনে মুদ্রিত। যদি তাদের পাঠানো হয় তবে কার্সারটি এমন একটি লাইনে তৃতীয় অবস্থানে রয়েছে xxxxyyyyzzzz, যার ফলস্বরূপ:

xxfooyyybarz

টার্মিনালগুলিতে যা ট্যাবুলেশন সমর্থন করে না, টার্মিনাল ড্রাইভারগুলি সেই ট্যাবগুলিকে ফাঁকের ক্রমগুলিতে অনুবাদ করতে কনফিগার করা যেতে পারে। ( stty tab3)।

এসপিসি অক্ষর, মূল টেলি-টাইপরাইটারগুলি কার্সারটিকে ডানদিকে \bসরিয়ে ফেলত, যখন ব্যাকস্পেস ( ) এটিকে বাম দিকে সরিয়ে দেয়। এখন আধুনিক টার্মিনালগুলিতে, এসপিসি ডানদিকে চলে যায় এবং মোছা হয় (কোনও স্থানের অক্ষর যেমনটি আপনি আশা করেছিলেন তেমন লিখেছেন) writes সুতরাং এর দুলটি \bASCII এর চেয়ে নতুন কিছু হতে হয়েছিল। অধিকাংশ আধুনিক টার্মিনাল, এটি আসলে বর্ণের একটি ক্রম আছে: <Esc>, [, C

nবাম, ডান, উপরে, নীচে বা স্ক্রিনের যে কোনও অবস্থানে অক্ষরগুলি সরানোর জন্য আরও পালানোর ক্রম রয়েছে । পর্দার লাইনগুলি বা অঞ্চলগুলি মুছতে (ফাঁকা করে পূরণ করুন) এর জন্য অন্যান্য পালানোর ক্রম রয়েছে etc.

সেই সিকোয়েন্স সাধারণত মত চাক্ষুষ অ্যাপ্লিকেশন দ্বারা ব্যবহার করা হয় vi, lynx, mutt, dialogযেখানে টেক্সট পর্দায় নির্বিচারে অবস্থানের সময়ে লেখা হয়।

এখন, সমস্ত এক্স 11 টার্মিনাল এমুলেটর এবং GNU এর মতো কয়েকটি অন্যান্য নন-এক্স 11 screenআপনাকে কপি পেস্টের জন্য স্ক্রিনের অঞ্চলগুলি নির্বাচন করতে দেয়। আপনি যখন viসম্পাদকটিতে যা দেখেন তার একটি অংশ নির্বাচন করেন , আপনি সেই আউটপুট উত্পাদন করতে ব্যবহৃত সমস্ত পালানোর ক্রমগুলি অনুলিপি করতে চান না। আপনি যে পাঠ্যটি দেখতে চান তা নির্বাচন করতে চান।

উদাহরণস্বরূপ আপনি যদি চালান:

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

কোনটি একজন সম্পাদক অধিবেশন যেখানে আপনি প্রবেশ simulates abC, শুরুতে ফিরে যান, প্রতিস্থাপন abসঙ্গে AC, Cসঙ্গে B, পরবর্তী ট্যাব বন্ধ করতে, আরও একটি কলাম ডানদিকে, দুটি কলাম বামে, স্থানান্তর তারপর তারপর তারপর এন্টার D

আপনি দেখুন:

ABC    D

এটি ABC, একটি 4 কলাম ফাঁক এবং D

আপনি যদি মাউসের সাথে xtermবা puttyএটি নির্বাচন করেন তবে তারা নির্বাচনের মধ্যে ABC4 টি স্থানের অক্ষর সংরক্ষণ করবে এবং 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>এমএসডিওএস পাঠ্য ফাইলগুলিতেও এবং কখনও কখনও <FF>পৃষ্ঠা বিরতির জন্য)।

সুতরাং কিছু টার্মিনাল এমুলেটরগুলি সংরক্ষণের জন্য অনুলিপি-পেস্ট বাফারগুলিতে যখন সম্ভব হয় তখন সেগুলি অনুলিপি করা পছন্দ করে (এটি সাধারণত এটির ক্ষেত্রে <CR>নয় <LF>তবে)।

উদাহরণস্বরূপ, ভিটিই-ভিত্তিক টার্মিনালগুলিতে gnome-terminal, আপনি দেখতে পাচ্ছেন যে আপনি যখন printf 'a\tb\n'খালি লাইনে আউটপুট নির্বাচন করেন , gnome-terminalআসলে a\tbএক্স 11 নির্বাচনের পরিবর্তে a7 স্পেস এবং সংরক্ষণ করে b

কিন্তু আউটপুট printf 'a\t\bb\n', এটা দোকানে a, 6 স্পেস এবং b, এবং printf 'a\r\tb\n', a, 7 স্পেস এবং b

অন্যান্য ক্ষেত্রেও রয়েছে যখন টার্মিনালগুলি প্রকৃত ইনপুটটি অনুলিপি করার চেষ্টা করবে, যেমন আপনি যখন চালানোর পরে দুটি লাইন নির্বাচন করেন printf 'a \nb\n'যেখানে সেই অদৃশ্য ট্রেলিং স্পেসটি সংরক্ষণ করা হবে। অথবা দুটি লাইন নির্বাচন করার সময় একটি এলএফ বর্ণচিহ্ন অন্তর্ভুক্ত করা হয় না যখন দুটি লাইন ডান মার্জিনে মোড়ানো থেকে ফলাফল হয়।

এখন, আপনি যদি আউটপুটটি printfক্লিপবার্ড X11সিলেক্ট করে নির্বাচন করতে চান তবে সরাসরি এটির মতো করাই ভাল:

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

মনে রাখবেন যে আপনি যখন এটি xtermবা অন্যান্য টার্মিনালগুলিতে পেস্ট করেন তখন xtermবাস্তবে এটি প্রতিস্থাপন করা \nহয় \rকারণ xtermআপনি যখন চাপছেন তখন অক্ষরটি প্রেরণ করে Enter(এবং টার্মিনাল ড্রাইভারটি এটিকে আবার অনুবাদ করতে পারে \n)।


এটি খুব অন্তর্দৃষ্টিযুক্ত, আপনাকে ধন্যবাদ। আমি এক্সক্লিপ সমাধানটি চেষ্টা করেছি এবং এটি কাজ করে। তবে এটি আমার মনের মধ্যে ঠিক কী কাজ করে না এবং এক্স 11 প্রয়োজন requires এটি হতে পারে এটি কিছু সময়ে কার্যকর হবে, ধন্যবাদ!
আসু

@ আসু, ইউনিক্সের X11মতো xtermবা টার্মিনাল এমুলেটরগুলিতে অনুলিপি-পেস্ট নির্বাচন পরিচালনা করে putty। অন্যান্য টার্মিনাল emulators তারা নিজের কপি-পেস্ট প্রক্রিয়া এবং সেখানে নির্বিচারে বিষয়বস্তু, মত সঞ্চয় করতে উপায়ে থাকতে পারে readbuf এবং registerগনুহ পর্দায় কমান্ড।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.