从数字中删除前导零

Cha*_*lie 3 bash

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

VAR=00005
VAR=00010
VAR=00601
VAR=00550
Run Code Online (Sandbox Code Playgroud)

echo $VAR #5
echo $VAR #10
echo $VAR #601
echo $VAR #550
Run Code Online (Sandbox Code Playgroud)

ДМИ*_*КОВ 6

$> cat text    
00005
00010
00601
00550

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

使用printf

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

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


Ken*_*ent 6

或者像这样:

kent$  echo "00005
00010
00601
00550"|awk '$0*=1'
5
10
601
550
Run Code Online (Sandbox Code Playgroud)

对于您更新的问题(使用 VAR)

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

请参见下面的示例:

kent$  VAR=00601

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

kent$  echo $VAR
601
Run Code Online (Sandbox Code Playgroud)

编辑

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

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

在 zsh 下:

kent$  v=08

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

kent$  echo $v
8
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)