POSIX는 필요 printf 의를 %-20s측면에서 그 (20)를 계산하는 바이트 하지 문자 로 그 거의 의미에도 불구하고 printf인쇄하는 것입니다 텍스트를 (토론 참조 형식, 오스틴 그룹에서 (POSIX) 및 bash메일 링리스트).
printf의 내장 bash및 대부분의 다른 POSIX 쉘은 명예.
zshsh에뮬레이션 에서도 바보 같은 요구 사항을 무시 하므로 printf예상대로 작동합니다. POSIX와 유사한 쉘이 아닌 printf내장에 대해서도 동일합니다 fish.
üUTF-8 인코딩 문자 (U + 00FC)이 불일치를 설명 두 바이트 (0xc3 및 0xbc)로 이루어진다.
$ printf %s 'Früchte und Gemüse' | wc -mcL
18 20 18
이 문자열은 18 자이며 18 열 ( 입력에서 가장 넓은 행의 표시 너비를보고하기 -L위한 GNU wc확장)이지만 20 바이트로 인코딩됩니다.
에서 zsh또는 fish텍스트가 올바르게 정렬됩니다.
이제 0 너비 (U + 0308과 같은 문자 결합, 분음 부호)와 같은 문자가 있거나 많은 아시아 스크립트 (Tab과 같은 제어 문자는 언급하지 않음)와 같이 두 배 너비를 가지며 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탭 장치가 출력 장치에서 얼마나 멀리 떨어져 있고 인쇄를 시작하는 위치를 알아야합니다. 모든 제어 문자가 너비를 갖는 것으로 간주 하지만 백 스페이스 문자 ( (bold )가 작성된 roff출력에서 와 같이)에서 우연히 작동합니다 .XXX\bXksh93-1
다른 옵션으로 시도해 볼 수 있습니다.
printf '%s\t|\n' u ü $'u\u308' $'\u1100' | expand -t3
그것은 일부 expand구현에서 작동합니다 (GNU는 아님).
GNU 시스템에서는 문자 awk로 printf계산되는 GNU 를 사용할 수 있습니다 (바이트가 아니라 표시 너비가 아니므로 0- 폭 또는 2- 폭 문자의 경우 OK가 아니라 샘플의 경우 OK).
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"