You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取ZSH中函数返回字符串的实际显示长度

ZSH中计算含ANSI转义序列字符串的实际显示长度

要计算带ANSI颜色转义序列的字符串在终端的实际显示长度,核心是先剥离所有转义序列,再计算剩余字符的长度。以下是两种可靠方案:

方案一:用ZSH内置参数扩展(无需外部工具)

利用ZSH的原生字符串替换功能直接移除ANSI转义序列:

# 获取目标函数的输出
func_output=$(git_bubble)
# 匹配并移除所有标准ANSI控制序列(覆盖颜色、光标操作等类型)
stripped=${func_output//$'\e'\[[0-9;]*[a-zA-Z]/}
# 计算实际显示的字符长度
display_length=${#stripped}
echo "实际显示字符数: $display_length"

这里的正则$'\e'\[[0-9;]*[a-zA-Z]精准匹配ANSI转义序列结构:以ESC字符($'\e')开头,后跟[、数字/分号组合,最后以字母结尾(如m对应颜色控制,A对应光标上移)。

方案二:用sed工具过滤转义序列

如果需要兼容更多复杂场景,也可以借助sed做文本过滤:

# 定义剥离ANSI序列的函数
strip_ansi() {
  echo -n "$1" | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'
}

# 执行计算
func_output=$(git_bubble)
display_length=${#$(strip_ansi "$func_output")}
echo "实际显示字符数: $display_length"

验证示例

假设目标输出是带红色的Hello:$'\e[31mHello\e[0m',直接用${#}会得到13(包含转义序列的总长度),用上述方法处理后,stripped值为纯文本Hello,长度为5,与终端实际显示的字符数一致。

内容的提问来源于stack exchange,提问作者Al Timofeyev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:30:54