使用 printf 或 echo 在字符串前添加前导字符

pol*_*lym 7 shell string printf

如何添加前导字符以将字符串填充到特定长度?

假设我想在字符串前面添加零,如果所述字符串短于 20 个字符:

printf '%020s\n' "$line"
Run Code Online (Sandbox Code Playgroud)

然而,这会用前导空格填充字符串,而不是其他任何东西,例如零。

该字符串可以是包含数字和其他字符的随机字符串。

我不想将字符串拆分为 number + rest for printf '%020i' $numberor printf '%020d $number'

我目前的输出是:

         shortstring
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

000000000shortstring
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 5

只需手动进行填充即可。如果您坚持使用 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)


cuo*_*glm 1

如果你可以使用perl

\n\n
$ 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,编译时会出现警告:

\n\n
$ 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,您可以尝试:

\n\n
$ 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

\n