在字符串中填充零


76

我正在编写bash脚本以获取一些播客。问题在于,某些播客编号是一位数字,而其他的是2/3位数字,因此我需要填充它们以使其全部变为3位数字。

我尝试了以下方法:

n=1

n = printf %03d $n

wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3

但是变量'n'不会永久填充。我如何使其永久化?

bash 

Answers:


101

使用反引号指定printf命令(``)的结果:

n=1
wget http://aolradio.podcast.aol.com/sn/SN-`printf %03d $n`.mp3

编辑:请注意,我删除了实际上不是必需的一行。如果要将'printf%...'的输出分配给n,则可以使用

n=`printf %03d $n`

然后,使用之前使用的$ n变量替换。


5
为什么不呢wget $(printf http://aolradio.podcast.aol.com/sn/SN-%03d $n.mp3, $n)?只需将整个URL放入printf语句中即可。
David W.

如果您实际上需要填充字符串怎么办?例如,我有字符串“ Hello”,但我需要始终打印10个字符,我将需要打印字符串:“ ----- Hello”,或者如果我有“是”,我仍然会打印10个字符,如下所示: “ -------是”
m4l490n

41

似乎您要分配printf命令的返回值(这是它的退出代码),您想分配printf的输出。

bash-3.2$ n=1
bash-3.2$ n=$(printf %03d $n)
bash-3.2$ echo $n
001

2
为什么$()更可取?
bli

3
@bli它可以嵌套,而反引号则不能嵌套(至少在没有某种形式的转义的情况下)
Neil

19

但是请注意,如果您的输入字符串的前导零!
printf仍然会进行填充,但是还会将您的字符串转换为十六进制八进制格式。

# looks ok
$ echo `printf "%05d" 03`
00003

# but not for numbers over 8
$ echo `printf "%05d" 033`
00027

解决方案似乎是打印浮点数而不是十进制数。
诀窍是用省略小数位.0f

# works with leading zero
$ echo `printf "%05.0f" 033`
00033

# as well as without
$ echo `printf "%05.0f" 33`
00033

2
这是因为printf将“ 0n”作为八进制。八进制33 =十进制27。不是十六进制。
2014年

13

为了避免上下文切换:

a="123"
b="00000${a}"
c="${b: -5}"

4
n=`printf '%03d' "2"`

注意间距和反引号


3

正如nasallad所提到的,请最好使用命令替换,即$(...),因为它取代了后方字符,即`...`

尝试嵌套多个命令替换而不是转义(即“反斜杠”)后退标记时,使用起来要容易得多。


0

这是对cC Xx给出的答案的回应。只有在a的值小于5位数时,它才会起作用。

考虑什么时候a=12345678。它将截断前导数字:

a="12345678" 
b="00000${a}" 
c="${b: -5}" 
echo "$a, $b, $c"

这给出以下输出:

12345678, 0000012345678, 45678

放入if来检查的值a小于5位数字的然后这样做可能是解决方案:

if [[ $a -lt 9999 ]] ; then b="00000${a}" ; c="${b: -5}" ;  else c=$a; fi  

如果将if检查a的值小于5位,然后这样做可能是解决方案。
西瓦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.