繁体   English   中英

bash - 如何将带有 printf 的文本与非 ASCII 字符的列对齐?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM