POSIX gerektirir printf
's %-20s
açısından bu 20 saymak bayt değil karakterler olarak o küçük mantıklı olsa da printf
yazdırmaktır metni (tartışma biçimlendirilmiş, Austin Grubu'nda (POSIX) ve bash
e-posta listeleri).
printf
Arasında yerleşik bash
ve diğer birçok POSIX kabukları o onur.
zsh
aptal gereksinimi ( sh
öykünme durumunda bile ) görmezden gelir, printf
orada beklediğiniz gibi çalışır. İçin aynı printf
bir 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 -L
bir GNU wc
uzantısıdır) ancak 20 baytta kodlanır.
In zsh
Or 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 zsh
hizalamayan 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|
ü|
ü|
ᄀ|
ksh93
ekran genişliği %Ls
cinsinden 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 ( printf
sekme 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 ksh93
bir 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ı expand
uygulamalarla çalışır (GNU’nun olmasa da).
GNU sistemlerinde, GNU'yu kullanabilirsiniz awk
olan 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"