如何从 Linux 命令行获取字符串的显示宽度?

kcg*_*ost 2 bash ubuntu fonts awk svg

我正在开发一个 AWK 脚本,它逐行处理文本文件,将它们格式化并将它们填充到 SVG 文件文本字段中。SVG 会自动处理文本换行,但我想预测每行的换行位置。(我需要一些字符来重复并延伸到行尾)。我知道文本字段的确切字体、字体大小和宽度。

Linux 中是否有标准实用程序或在 Ubuntu 中很容易获得,可以在给定字符串、字体和字体大小的情况下提供以像素或英寸为单位的宽度?

例如:

get-width 'Nimbus Sans L' 18 "test string"
returns "x pixels"
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 5

您可以使用 ghostscript 解释器执行此操作,假设您拥有该解释器并且字体设置正确。

这是可能神秘的咒语:

gs -dQUIET -sDEVICE=nullpage 2>/dev/null - \
   <<<'18 /NimbusSanL-Regu   findfont exch scalefont setfont
      (test string)          stringwidth pop =='
Run Code Online (Sandbox Code Playgroud)

使用会-dQUIET抑制有关字体替换的警告,这可能不是一个好主意,除非您对如何命名要查找的字体有所了解。

ghostscript不是布局引擎,您可能会发现测量不适用于复杂的双向文本、组合字符或东亚语言。(我用一点阿拉伯语测试了它,它没问题,但不能保证。)它不紧缩,所以它通常会产生比好的布局引擎大一点的测量值,如果字体使用变音符号定位,它可能会大得多字距调整。

最后,如果您的文本包含不平衡的括号或反斜杠,您需要对它们进行转义。我使用以下内容:

"$(sed 's/[()\\]/\\&/g' <<<"$text")"
Run Code Online (Sandbox Code Playgroud)

这是因为 Postscript 字符串包含在(...)-- (test string)-- 中,并且允许包含平衡括号。不平衡的括号通常会产生语法错误,除非它们被反斜杠转义。