如何计算不含转义码的带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
相关产品推荐
相关产品推荐

