[英]bash - How to align text with printf into columns with non-ascii characters?
如何使printf
将值对齐到列中,即使是非 ascii 字符?
以下命令应将第二个和第三个参数中的值对齐到固定的 20 个字符宽度:
printf "%-20s %-20s\n" "Foo" "Bar"
printf "%-20s %-20s\n" "Fooo" "Bar"
printf "%-20s %-20s\n" "Foooó" "Bar"
printf "%-20s %-20s\n" "Foooóó" "Bar"
我希望打印以下内容:
Foo Bar
Fooo Bar
Foooó Bar
Foooóó Bar
实际上,这会被打印出来:
Foo Bar
Fooo Bar
Foooó Bar
Foooóó Bar
由于某种原因,任何非 ascii 字符(例如我示例中的ó
)都会将列缩短 1 个字符。
非 ascii 字符,例如ó
不会像单宽字符的 ASCII 那样打印。
一种解决方案是在printf
和 pipe output 中的 2 个字符串之间使用tab
符到column
:
prnt() {
printf "%-20s\t%-20s\n" "Foo" "Bar"
printf "%-20s\t%-20s\n" "Fooo" "Bar"
printf "%-20s\t%-20s\n" "Foooo" "Bar"
printf "%-20s\t%-20s\n" "Fooooo" "Bar"
printf "%-20s\t%-20s\n" "Foooooo" "Bar"
printf "%-20s\t%-20s\n" "Fooooooo" "Bar"
printf "%-20s\t%-20s\n" "Foooooooo" "Bar"
printf "%-20s\t%-20s\n" "Fooooooooo" "Bar"
printf "%-20s\t%-20s\n" "Foooooooooo" "Bar"
printf "%-20s\t%-20s\n" "Fóó" "Bar"
printf "%-20s\t%-20s\n" "Fóóó" "Bar"
printf "%-20s\t%-20s\n" "Fóóóó" "Bar"
printf "%-20s\t%-20s\n" "Fóóóóó" "Bar"
printf "%-20s\t%-20s\n" "Fóóóóóó" "Bar"
printf "%-20s\t%-20s\n" "Fóóóóóóó" "Bar"
printf "%-20s\t%-20s\n" "Fóóóóóóóó" "Bar"
printf "%-20s\t%-20s\n" "Fóóóóóóóóó" "Bar"
printf "%-20s\t%-20s\n" "Fóóóóóóóóóó" "Bar"
}
prnt | column -t -s $'\t'
Output:
Foo Bar
Fooo Bar
Foooo Bar
Fooooo Bar
Foooooo Bar
Fooooooo Bar
Foooooooo Bar
Fooooooooo Bar
Foooooooooo Bar
Fóó Bar
Fóóó Bar
Fóóóó Bar
Fóóóóó Bar
Fóóóóóó Bar
Fóóóóóóó Bar
Fóóóóóóóó Bar
Fóóóóóóóóó Bar
Fóóóóóóóóóó Bar
另一种解决方案是使用 awk。Awk 的printf
似乎比 bash 的 printf 更能理解 unicode。尝试:
$ cat script.sh
#!/bin/sh
awk 'BEGIN{
printf "%-20s %-20s\n", "Foo", "Bar"
printf "%-20s %-20s\n", "Fooo", "Bar"
printf "%-20s %-20s\n", "Foooó", "Bar"
printf "%-20s %-20s\n", "Foooóó", "Bar"
}'
运行时,这会产生排列的列:
$ sh script.sh
Foo Bar
Fooo Bar
Foooó Bar
Foooóó Bar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.