POSIX gerektirir printf 's %-20saçısından bu 20 saymak bayt değil karakterler olarak o küçük mantıklı olsa da printfyazdırmaktır metni (tartışma biçimlendirilmiş, Austin Grubu'nda (POSIX) ve bashe-posta listeleri).
printfArasında yerleşik bashve diğer birçok POSIX kabukları o onur.
zshaptal gereksinimi ( shöykünme durumunda bile ) görmezden gelir, printforada beklediğiniz gibi çalışır. İçin aynı printfbir yerleşiği fish(bir POSIX gibi kabuk).
üUTF-8 kodlanmış karakteri (U 00FC), hatayı açıklar iki bayt (0xc3 ve 0xbc) yapılmıştır.
$ printf %s 'Früchte und Gemüse' | wc -mcL
18 20 18
Bu dize 18 karakterden oluşur, 18 sütun genişliğindedir ( girişteki en geniş satırın görüntü genişliğini bildiren -Lbir GNU wcuzantısıdır) ancak 20 baytta kodlanır.
In zshOr fish, metni doğru hizalanmış olacaktır.
Şimdi, 0 genişlikli (U + 0308 gibi karakterleri bir araya getirme karakterleri gibi) ya da birçok Asya alfabesinde olduğu gibi (Tab gibi kontrol karakterlerinden bahsetmeden) çift genişliğe sahip ve hatta zshhizalamayan karakterler de var. bunlar düzgün.
Örnek zsh:
$ printf '%3s|\n' u ü $'u\u308' $'\u1100'
u|
ü|
ü|
ᄀ|
İçinde bash:
$ printf '%3s|\n' u ü $'u\u308' $'\u1100'
u|
ü|
ü|
ᄀ|
ksh93ekran genişliği %Lscinsinden genişliği saymak için bir format belirtimine sahiptir .
$ printf '%3Ls|\n' u ü $'u\u308' $'\u1100'
u|
ü|
ü|
ᄀ|
Metin, TAB gibi kontrol karakterleri içeriyorsa, bu hala işe yaramaz ( printfsekme duraklarının çıkış cihazında ne kadar uzakta olduklarını ve hangi konumda basmaya başladığını bilmek zorunda kalırdı). O (olduğu gibi geri silme karakterleri ile kazara çalışır roffçıkışı X(kalın X) olarak yazılır X\bX) olarak gerçi ksh93bir genişliğe sahip olarak tüm kontrol karakterleri dikkate alır -1.
Diğer seçenekler olarak deneyebilirsiniz:
printf '%s\t|\n' u ü $'u\u308' $'\u1100' | expand -t3
Bu, bazı expanduygulamalarla çalışır (GNU’nun olmasa da).
GNU sistemlerinde, GNU'yu kullanabilirsiniz awkolan printf(hala değil bayt değil gösterilecek-genişlikleri, bu nedenle numune için 0 genişlikli veya 2 genişlikli karakterler için Tamam, ama tamam değil) sayılarının yanmış maddedeki:
gawk 'BEGIN {for (i = 1; i < ARGC; i++) printf "%-3s|\n", ARGV[i]}
' u ü $'u\u308' $'\u1100'
Çıktı bir terminale giderse, imleç konumlandırma kaçış dizilerini de kullanabilirsiniz. Sevmek:
forward21=$(tput cuf 21)
printf '%s\r%s%s\n' \
"Früchte und Gemüse" "$forward21" "foo" \
"Milchprodukte" "$forward21" "bar" \
"12345678901234567890" "$forward21" "baz"