正确的模式来改变bash中的数组值

时间:2014-04-22 12:27:39

标签: arrays regex bash replace

我需要从数组中的所有值中删除第一个0,例如变化

array=( 01 02 03 [...] 10 [...] 20 [...] )

array=(1 2 3 [...] 10 [...] 20 [...] )  

我想我可以用${parameter/pattern/string}做到这一点,但我对语法很遗憾。

4 个答案:

答案 0 :(得分:4)

鉴于它是一组数字,我会算术而不是尝试执行字符串替换:

$ a=( {01..20} )
$ echo "${a[@]}"
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
$ b=()
$ for i in "${a[@]}"; do b+=( $((10#$i)) ); done
$ echo "${b[@]}"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

此处$((10#$i))会导致变量i被评估为基数为10的数字。

答案 1 :(得分:3)

$ array=(01 02 03 10 20)
$ echo "${array[@]#0}"
1 2 3 10 20

答案 2 :(得分:2)

shopt -s extglob
b=("${a[@]##+(0)}")
printf "%s\n" "${b[@]}"

答案 3 :(得分:-1)

您可以使用参数扩展并直接重新定义数组:

[self.savingBeaconSpecs addObject:artwork];

array=(${array[@]#0}) ${string#substring}前面删除$substring的最短匹配。

如果要删除多个零,例如$string(001 002),您可以使用(1 2),然后使用shopt -s extglob

测试

"${var##*(0)}"

并且有多个零:

$ a=(01 02 03 10 11)
$ ar=(${a[@]#0})
$ for i in "${ar[@]}"; do echo $i; done
1
2
3
10
11

来源: