POSIX প্রয়োজন printf
এর %-20s
পরিপ্রেক্ষিতে ওই 20 গণনা বাইট না অক্ষর যে যদিও সামান্য জ্ঞান করে তোলে যেমন printf
প্রিন্ট করতে হয় টেক্সট , ফরম্যাট (আলোচনা দেখুন অস্টিন গ্রুপ এ (POSIX) এবং bash
মেইলিং তালিকা)।
printf
এর builtin bash
এবং অন্যান্য অধিকাংশ POSIX শাঁস যে সম্মান।
zsh
সেই নির্বোধ প্রয়োজনকে উপেক্ষা করে (এমনকি sh
অনুকরণেও) তাই printf
আপনি সেখানে যেমন প্রত্যাশা করতেন তেমন কাজ করে। জন্য একই printf
এর builtin fish
(একটি POSIX মত শেল)।
ü
অক্ষর (U + এ 00FC), যখন হল UTF-8 এনকোড দুই বাইট (0xc3 এবং 0xbc), যা অমিল ব্যাখ্যা তৈরি করা হয়।
$ printf %s 'Früchte und Gemüse' | wc -mcL
18 20 18
এই স্ট্রিংটি 18 টি অক্ষর দ্বারা তৈরি, 18 কলাম প্রশস্ত ( ইনপুটটিতে প্রশস্ত রেখার প্রস্থের প্রস্থের প্রতিবেদন করার জন্য -L
একটি জিএনইউ wc
এক্সটেনশন হওয়া ) তবে 20 বাইটে এনকোড করা রয়েছে।
ইন zsh
বা fish
টেক্সট সঠিকভাবে প্রান্তিককৃত হবে।
এখন, এমন কিছু অক্ষরও রয়েছে যেগুলির 0-প্রস্থ রয়েছে (যেমন ইউ + 0308, সংমিশ্রণ ডায়ারিসিসের মতো অক্ষরগুলি সমন্বিত) বা অনেক এশিয়াটিক স্ক্রিপ্টগুলির মতো ডাবল-প্রস্থ রয়েছে (ট্যাবের মতো নিয়ন্ত্রণ অক্ষরের উল্লেখ না করা) এবং এমনকি zsh
বিন্যস্ত হয় না যারা সঠিকভাবে।
উদাহরণ zsh
:
$ printf '%3s|\n' u ü $'u\u308' $'\u1100'
u|
ü|
ü|
ᄀ|
ইন bash
:
$ printf '%3s|\n' u ü $'u\u308' $'\u1100'
u|
ü|
ü|
ᄀ|
ksh93
প্রদর্শনের প্রস্থের %Ls
ক্ষেত্রে প্রস্থটি গণনা করার জন্য একটি ফর্ম্যাট স্পেসিফিকেশন রয়েছে ।
$ printf '%3Ls|\n' u ü $'u\u308' $'\u1100'
u|
ü|
ü|
ᄀ|
এটি এখনও কার্যকর হয় না যদি পাঠ্যটিতে TAB এর মতো নিয়ন্ত্রণের অক্ষর থাকে (কীভাবে এটি হতে পারে তা printf
জানতে হবে যে আউটপুট ডিভাইসে ট্যাব স্টপগুলি কতটা দূরে রয়েছে এবং এটি কোন অবস্থানে মুদ্রণ শুরু করে)। এটি ব্যাকস্পেস অক্ষরগুলির সাথে দুর্ঘটনার দ্বারা কাজ করে (যেমন roff
আউটপুটে যেখানে X
(গা bold় X
) লেখা থাকে X\bX
) যদিও ksh93
সমস্ত নিয়ন্ত্রণ অক্ষরকে প্রস্থ বলে বিবেচনা করে -1
।
অন্যান্য বিকল্প হিসাবে, আপনি চেষ্টা করতে পারেন:
printf '%s\t|\n' u ü $'u\u308' $'\u1100' | expand -t3
এটি কিছু expand
বাস্তবায়ন নিয়ে কাজ করে (জিএনইউ এর যদিও নয়)।
জিএনইউ সিস্টেমে আপনি জিএনইউ ব্যবহার করতে পারেন awk
যার printf
সংখ্যাগুলি চরগুলিতে গণনা করা হয় (বাইটস নয়, প্রদর্শন প্রশস্ততা নয়, তবে 0-প্রশস্ত বা 2-প্রস্থের অক্ষরের জন্য ঠিক নেই তবে আপনার নমুনার জন্য ঠিক আছে):
gawk 'BEGIN {for (i = 1; i < ARGC; i++) printf "%-3s|\n", ARGV[i]}
' u ü $'u\u308' $'\u1100'
যদি আউটপুটটি কোনও টার্মিনালে যায়, আপনি কার্সার পজিশনিং এস্কেপ সিকোয়েন্সগুলিও ব্যবহার করতে পারেন। ভালো লেগেছে:
forward21=$(tput cuf 21)
printf '%s\r%s%s\n' \
"Früchte und Gemüse" "$forward21" "foo" \
"Milchprodukte" "$forward21" "bar" \
"12345678901234567890" "$forward21" "baz"