我如何通过管道输入 printf?

How do I pipe into printf?

我快要疯了试图理解这个简单示例(zsh 或 bash)的问题所在:

echo -n "6842" | printf "%'d"

输出是0...为什么?我希望输出为 6,842

提前致谢,我已经用了一个小时 google 试图解决这个问题...!

printf 不从标准输入读取格式参数,而是直接从命令行读取参数。例如,这有效:

$ printf "%'d" 6842
6,842

您可以使用命令替换将命令的输出转换为命令行参数:

$ printf "%'d" $(echo -n 6842)
6,842

如果要在管道内调用 printf,可以使用 xargs 读取输入并使用适当的参数执行 printf

echo -n "6842" | xargs printf "%'d"

printf 不格式化在标准输入上传递给它的数据;它有一组参数,第一个是格式,其余是要显示的值。

幸运的是,这正是 xargs 的目的;引用手册:

xargs - build and execute command lines from standard input

因此,您可以通过管道传输到 xargs,而不是直接传输到 printf,然后使用给定的参数告诉它到 运行 printf。简而言之:

echo -n "6842" | xargs printf "%'d"