Sté*_*las 12
对于某些printf
实现(包括GNUprintf
和printf
的内置ksh93
,zsh
,bash
和lksh
(但不是dash
也不yash
)在GNU系统),并假设你的系统有一个法语(法国或加拿大至少),或瑞典或斯洛文尼亚和马其顿或吉尔吉斯语言环境(和还有一些,即那些有空格作为千位分隔符的):
$ LC_ALL=fr_FR locale -k thousands_sep
thousands_sep=" "
$ LC_ALL=fr_FR printf "%'d\n" 10000000000
10 000 000 000
Run Code Online (Sandbox Code Playgroud)
也适用于一些awk
实现:
$ LC_ALL=fr_FR awk 'BEGIN{printf "%'\''d\n", 1e10}'
10 000 000 000
Run Code Online (Sandbox Code Playgroud)
如果您知道未设置LC_NUMERIC
,LC_ALL
则可以使用代替LC_ALL
。
你需要循环sed
:
echo "9765625000 * 1024 = 10000000000000" | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1 \2/;ta'
9 765 625 000 * 1 024 = 10 000 000 000 000
Run Code Online (Sandbox Code Playgroud)
(谢谢你的改进,斯蒂芬!)
或者更好的可读性,但可能与旧sed
版本不兼容,带有扩展的正则表达式:
echo "9765625000 * 1024 = 10000000000000" | sed -E -e :a -e 's/(.*[0-9])([0-9]{3})/\1 \2/;ta'
9 765 625 000 * 1 024 = 10 000 000 000 000
Run Code Online (Sandbox Code Playgroud)
可以使用 sed 和 rev 的简单组合 -
echo "I have 10000013984 oranges" | rev | sed "s/[0-9][0-9][0-9]/& /g" | rev
Run Code Online (Sandbox Code Playgroud)
第一个 rev 需要从右到左替换数字,第二个 rev 需要恢复原始字符串。