如何获取Bash字符串在终端中的实际打印长度?
在Bash中获取字符串的终端打印字符数
需求很明确:在Bash中处理字符串时,需要准确获取它在终端中的打印字符数,用来实现三列对齐布局——让第二、第三列始终从终端的同一位置开始,需要根据实际打印长度补充足够空格。
现有方法的问题示例
- 带重音的Unicode字符场景:
v='féé' # Bash内置长度计算,返回5(实际打印是3个字符) echo "${#v}" > 5 # wc -m 统计,返回5 printf '%s' "${v}" | wc -m > 5 # awk length统计,返回5 printf '%s' "${v}" | awk '{print length}' > 5
- 转义序列组成的Unicode字符场景:
v="de\314\201tresse" # 终端打印结果为 détresse(共8个字符) echo "${v}" > détresse # Python方法返回9,不符合实际打印长度 echo "${v}" | python3 -c 'v=input();print(len(v))' > 9
尝试过的方法及局限
之前找到的相对有效的方法是用Python读取输入后统计长度,但遇到由转义序列拼接成的Unicode字符时会出错——它会把转义后的字节当成独立字符统计,而非终端实际渲染出的单个字符。
额外说明
不需要处理\r、ANSI控制序列这类复杂场景,只需要覆盖文件名、文档内容这类人类常规编写的字符串。知道可以通过捕获打印前后的光标位置差来计算长度,但这种方法实现复杂且速度太慢,希望找到更快速可靠的方案。
内容的提问来源于stack exchange,提问作者Slagt
相关产品推荐
相关产品推荐

