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

如何计算不含转义码的带ANSI颜色代码字符串的长度?

解决jq中带ANSI颜色代码的字符串长度计算问题

要正确计算包含ANSI颜色代码字符串的可见字符长度,需要先过滤掉不可见的ANSI转义序列,再计算长度。以下是具体实现方案:

1. 定义移除ANSI转义序列的函数

ANSI颜色控制码的格式为ESC[数字/分号组合m(ESC对应\u001b),用正则匹配并清除这类序列:

def strip_ansi:
  gsub("\u001b\\[[0-9;]*m"; "");

2. 计算可见字符长度

基于上面的函数,实现visible_length来获取实际显示的字符数:

def visible_length:
  strip_ansi | length;

测试你的示例代码,现在能得到正确结果:

def escape: "\u001b";
def _red(text):
  escape + "[31m" + text + escape + "[0m";
_red("a") | visible_length # 返回1,符合预期

3. 修改左填充函数lp

将原函数中依赖的length替换为visible_length,让填充逻辑基于可见字符长度计算:

def strip_ansi:
  gsub("\u001b\\[[0-9;]*m"; "");
def visible_length:
  strip_ansi | length;

def lp($len):
  if . == null then "" else . end | tostring
  | ($len - visible_length) as $l
  | (" " * $l)[:$l] + .;

这样修改后,即使字符串包含ANSI颜色代码,lp函数也能根据可见字符的长度正确计算填充量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:20:48