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"