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

标签 bash ubuntu svg awk fonts

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

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

例如:

get-width 'Nimbus Sans L' 18 "test string"
returns "x pixels"

最佳答案

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

这是一个可能神秘的咒语:

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

使用 -dQUIET 可以抑制有关字体替换的警告,这可能不是一个好主意,直​​到您知道如何命名要查找的字体。

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

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

"$(sed 's/[()\\]/\\&/g' <<<"$text")"

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

关于bash - 如何从 Linux 命令行获取字符串的显示宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25367016/

相关文章:

linux - 一次性编辑linux子目录下所有相似文件

bash - ssh在后台运行脚本并获取其pid

bash - 异步运行ssh sudo

html - 像在 HTML Canvas 或 CSS 中一样为 SVG <image> 定义源矩形

javascript - 在 svg 元素上设置自定义属性 (Raphael)

python - 如何在使用 python 在提示符下发出命令后截取 stdout 的每一行

python - 试图在 Ubuntu 上安装 grequests?

ubuntu - Redis 使用 init.d 手动启动但不在启动时启动

c++ - 文件线程

javascript - d3js 缩放圆圈组