从数字中删除前导零

  • 本文关键字:删除 数字 bash
  • 更新时间 :
  • 英文 :


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

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

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

或像这样:

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在这里工作,可能是用我的壳做的事。我有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
$> cat text    
00005
00010
00601
00550
$> sed -r 's/0*([0-9]*)/1/' text    
5
10
601
550

使用printf

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

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

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

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

人们在0809方面遇到问题的原因是,带有尾随零的数字被 shell 视为八进制。 你可以做这样的事情:

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

以删除尾随前导零。

echo $((10#${VAR}))可以做你想做的事

至少适用于 bash 和 mksh。

来自 bash 手册:

具有前导 0 的常量被解释为八进制数。 前导"0x"或"0X"表示十六进制。否则,数字采用 [base#]n 的形式,其中可选基数是 2 到 64 之间的十进制数,表示算术基数,n 是该基数中的数字。如果省略 base#,则使用base 10。

mksh 的文档关于前导零的更简洁:

前缀为"10#"强制解释为十进制,即使使用前导零也是如此。

您可以使用

printf添加或删除前导零:

$ printf "%05dn" 5    
00005
$ printf "%dn" 00005
5
$ printf "%010dn" 00005
0000000005

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

printf "%dn" 0000
printf "%dn" 0001
printf "%dn" 0002
printf "%dn" 0003
printf "%dn" 0007
printf "%dn" 0008
printf "%dn" 0009
printf "%dn" 0010
printf "%dn" 0011
printf "%dn" 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

相关内容

  • 没有找到相关文章