如何对非拉丁字符使用 fmt 命令?

如何对非拉丁字符使用 fmt 命令?

我需要使用 fmt 以希腊语格式化一些文本输出,但它的行为与处理拉丁字符不同。例如,考虑下面包含 15 个字符的句子。

带有拉丁字符:

 $echo "Have a nice day" | fmt -w 16
 Have a nice day

但是,奇怪的是,对于非拉丁字符:

 $echo "Ηαωε α νιψε δαυ" | fmt -w 16
 Ηαωε α
 νιψε δαυ

事实上,对于上面的字符串,它打印不带换行符的句子的最小值是-w 28

 $echo "Ηαωε α νιψε δαυ" | fmt -w 28
 Ηαωε α νιψε δαυ
 $echo "Ηαωε α νιψε δαυ" | fmt -w 27
 Ηαωε α νιψε
 δαυ

有人可以解释为什么会发生这种情况以及如何解决它(如果可能)吗?

答案1

要回答您的问题,它不起作用,因为希腊字符是非拉丁字符、Unicode 字符,并且:

不像标杆, fmt 不支持 Unicode,...

https://en.wikipedia.org/wiki/Fmt

补充笔记

不幸的是,你的问题的第二部分是关于如何做的,

虽然最近似乎有一个关于如何包装 Unicode 的技术报告,例如 Heninger,Unicode Line Breaking Algorithm,2015-06-01http://www.unicode.org/reports/tr14/然而,这似乎只是规范,没有实际实现或提及软件操作示例。您可以尝试通过列出的电子邮件询问作者。

由于维基百科文章fmt提到了par,并且可以通过 获得apt-get,我决定在您发布的文本上尝试一下。

但我没有成功,它仍然没有按照你希望的方式包装:

$ echo "Ηαωε α νιψε δαυ" | par 16gr
Ηαωε α
νιψε δαυ

man页面非常困难,甚至作者也警告说它是:not well-written for the end-user,但如果您有决心,可以尝试一下运气来阅读它。

答案2

fmt因此,通常不支持“非拉丁语”(在您的示例中,可能是 UTF-8)。你也许可以使用par,它确实可以做到这一点。

有趣的是,Solaris 和 FreeBSD 的手册页fmt非常相似,这表明该程序自 20 世纪 80 年代中期以来就没有明显改进:

par可能会以软件包的形式提供给您的系统。如果没有,很容易编译,在这里找到:

http://www.nicemice.net/par/

另一方面,恰当的par缺乏对 UTF-8 的支持:

答案3

计划9的 utils 通常支持 UTF-8。你可以通过安装将它们安装到你的 UNIX 机器上plan9port。在 macOS 上,您可以使用 Homebrew

brew install plan9port

哪个安装他们的fmt指挥下9。它似乎按照你想要的方式运行:

$ echo "Ηαωε α νιψε δαυ" | 9 fmt -w 16
Ηαωε α νιψε δαυ
$ echo "Ηαωε α νιψε δαυ" | 9 fmt -w 14
Ηαωε α νιψε
δαυ

相关内容