这似乎是一项相当简单的任务,但我找不到一个快速可靠的解决方案.
我有bash中的字符串,我想知道将在终端上打印的字符数.我之所以需要这样做,是为了将字符串很好地对齐在三列中,每列n
个字符.为此,我需要添加尽可能多的"空格",以确保第二列和第三列始终从终端中的同一位置开始.
字符串长度有问题的示例:
v='féé'
echo "${#v1}"
> # 5 (should be 3)
printf '%s' "${v1}" | wc -m
> # 5 (should be 3)
printf '%s' "${v1}" | awk '{print length}'
> # 5 (should be 3)
我找到的最好的是这个,它可以工作most of the time.
echo "${v}" | python3 -c 'v=input();print(len(v))'
> # 3 (yeah!)
但有时,我的角色会被以下几个序列修改.我不能在这里复制/越过它,但它看起来是这样的:
v="de\314\201tresse"
echo "${v}"
> # détresse
echo "${v}" | python3 -c 'v=input();print(len(v))'
> # 9 (should be 8)
我知道使用\r
个字符或ANSI序列可能会更复杂,但我只需要处理在文件名、文档和其他人类编写的文件内容中常见的"常规"字符串.由于字符串是在终端中打印的,我猜一定有某个引擎知道或可以知道字符串的打印长度.
我也考虑了可能的解决方案,发送ANSI序列来获取打印字符串前后光标在终端中的位置,并使用差异来计算长度,但它看起来像一个我不想挖的兔子洞.此外,这将是非常缓慢的.