从数字中删除前导零

时间:2012-11-13 14:28:40

标签: bash

如何转换Bash / shell中的所有数字?

VAR=00005
VAR=00010
VAR=00601
VAR=00550

echo $VAR #5
echo $VAR #10
echo $VAR #601
echo $VAR #550

7 个答案:

答案 0 :(得分:4)

$> cat text    
00005
00010
00601
00550

$> sed -r 's/0*([0-9]*)/\1/' text    
5
10
601
550

使用printf

$> while read n; do printf "%0d\n" $((10#$n)); done < text
5
10
601
550

注意,当数字格式需要数字时,内部printf命令将使用关于基数的常见Bash算术规则。为了强制十进制表示和副作用也删除Bash变量的任何前导零,我们应该使用$((10#$n))

答案 1 :(得分:1)

使用extglob,您不需要任何外部流程:

shopt -s extglob                       # Enable extended globbing
for i in 00005 00010 00601 00550; do
    echo ${i##+(0)}
done

答案 2 :(得分:1)

人们在0809上遇到问题的原因是,shell将尾随零的数字视为八进制。您可以执行以下操作:

VAR="08"
let "VAR=10#${VAR}"
echo $VAR

删除尾随的零。

答案 3 :(得分:0)

或者像这样:

kent$  echo "00005
00010
00601
00550"|awk '$0*=1'
5
10
601
550

更新的问题(使用VAR)

首先,你应该有不同的变量名,而不是VAR。

见下面的例子:

kent$  VAR=00601

kent$  VAR=$((VAR+0))

kent$  echo $VAR
601

修改

评论。(08,09不起作用):

08,09,在这里工作,可能是我的shell要做的事情。我有zsh。我在bash下测试了以下内容,他们工作了。希望有所帮助:

zsh下的

kent$  v=08

kent$  v=$((v+0))

kent$  echo $v
8

在bash下,下面工作

kent@7PLaptop:/tmp$ bash -version
GNU bash, version 3.2.48(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
kent@7PLaptop:/tmp$ v=08
kent@7PLaptop:/tmp$ v=$(sed 's/^0*//'<<< $v)
kent@7PLaptop:/tmp$ echo $v
8

答案 4 :(得分:0)

WRONG function auth($uid, $pwd, $method = '', $tls = ??, $authz = '') (Don't do this) 可以为所欲为

答案 5 :(得分:-1)

您可以使用printf添加或删除前导零:

$ printf "%05d\n" 5    
00005

$ printf "%d\n" 00005
5

$ printf "%010d\n" 00005
0000000005

答案 6 :(得分:-1)

to:ДМИТРИЙМАЛИКОВ

printf "%d\n" 0000
printf "%d\n" 0001
printf "%d\n" 0002
printf "%d\n" 0003
printf "%d\n" 0007
printf "%d\n" 0008
printf "%d\n" 0009
printf "%d\n" 0010
printf "%d\n" 0011
printf "%d\n" 0012

结果

0
1
2
3
7
0 line 8: printf: 0008: invalid octal number
0 line 9: printf: 0009: invalid octal number
8 !error - correctly 10
9 !error - correctly 11
10 !error - correctly 12