pol*_*lym 7 shell string printf
如何添加前导字符以将字符串填充到特定长度?
假设我想在字符串前面添加零,如果所述字符串短于 20 个字符:
printf '%020s\n' "$line"
Run Code Online (Sandbox Code Playgroud)
然而,这会用前导空格填充字符串,而不是其他任何东西,例如零。
该字符串可以是包含数字和其他字符的随机字符串。
我不想将字符串拆分为 number + rest for printf '%020i' $number
or printf '%020d $number'
。
我目前的输出是:
shortstring
Run Code Online (Sandbox Code Playgroud)
我想要的输出是:
000000000shortstring
Run Code Online (Sandbox Code Playgroud)
只需手动进行填充即可。如果您坚持使用 POSIX 工具,我认为没有更直接的解决方案。
while [ ${#line} -lt 20 ]; do
line=0$line
done
Run Code Online (Sandbox Code Playgroud)
或者
n=${#line}
while [ $n -lt 20 ]; do
printf '0'
n=$((n-1))
done
printf "$line\n"
Run Code Online (Sandbox Code Playgroud)
当然,在 zsh 中,有相应的语法。与上面的代码片段不同,如果字符串长度超过 20 个字符,此代码片段将截断该字符串。如果您不想截断,可以附加字符串的尾部。
print -r ${(l:20::0:)line}
print -r ${(l:20::0:)line}${line:20}
Run Code Online (Sandbox Code Playgroud)
如果你可以使用perl
:
$ perl -e \'print sprintf "%020s\\n","shortstring"\'\n000000000shortstring\n
Run Code Online (Sandbox Code Playgroud)\n\n对于更一般的情况:
\n\n$ perl -e \'print sprintf "%020s\\n",shift\' shortstring\n000000000shortstring\n\n$ perl -e \'print sprintf "%020s\\n", $_ for @ARGV\' shortstring qwerty\n000000000shortstring\n00000000000000qwerty\n
Run Code Online (Sandbox Code Playgroud)\n\n笔记
\n\n某些平台可以使用前导零格式化输出字符串,至少在AIX
. 使用GNU gcc
,编译时会出现警告:
$ cat test.c\n#include <stdio.h>\n\nint main() {\n printf("%08s\\n", "qwerty");\n return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n然后:
\n\n$ gcc -Wall test.c\ntest.c: In function \xe2\x80\x98main\xe2\x80\x99:\ntest.c:4:5: warning: \'0\' flag used with \xe2\x80\x98%s\xe2\x80\x99 gnu_printf format [-Wformat]\n
Run Code Online (Sandbox Code Playgroud)\n\n如果您不想使用perl
,您可以尝试:
$ line=shortstring\n$ printf "%0$((20-${#line}))d%s" 0 $line\n000000000shortstring\n
Run Code Online (Sandbox Code Playgroud)\n\n当字符串长度大于 20 时,此方法无法处理。您可以使用 @mikeserv answer 来处理该问题或使用 before 进行检查printf
。