如何获取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
相关产品推荐
相关产品推荐

