POSIX는 필요 printf
의를 %-20s
측면에서 그 (20)를 계산하는 바이트 하지 문자 로 그 거의 의미에도 불구하고 printf
인쇄하는 것입니다 텍스트를 (토론 참조 형식, 오스틴 그룹에서 (POSIX) 및 bash
메일 링리스트).
printf
의 내장 bash
및 대부분의 다른 POSIX 쉘은 명예.
zsh
sh
에뮬레이션 에서도 바보 같은 요구 사항을 무시 하므로 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
출력에서 와 같이)에서 우연히 작동합니다 .X
X
X\bX
ksh93
-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"