我需要使用 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
可能会以软件包的形式提供给您的系统。如果没有,很容易编译,在这里找到:
另一方面,恰当的par
缺乏对 UTF-8 的支持:
- 回复:向 textproc/par 添加 UTF-8 支持说明了合并此类改进的问题。
- Debian Bug 报告日志 - #310495 par:无法正确处理 UTF-8 多字节字符已经开放有一段时间了