编辑数组元素 - 删除字符并减去 1

Editing Array Elements - Remove Character and Subtract 1

我有一个数组,其中有两个元素在当前状态下没有用,我需要删除一个字符并从中减去一个。

我试图去除字符,以便我可以将数字放入方程式,但它似乎没有将我新的无字符元素保存到变量中。

array=(ab cd C5 ef gh R6 0.88)

#get rid of C
RemChar="${array[2]}" | sed 's/[A-Za-z]*//g'
#subtract 1 from 5
NewValue=(($RemoveChar-1))
#Replace Old Element
${array[2]}=NewValue

#get rid of R
RemChar="${array[5]}" | sed 's/[A-Za-z]*//g'
#subtract 1 from 6
NewValue=(($RemoveChar-1))
#Replace Old Element
${array[5]}=NewValue

#Now the new array 'should' be:
array=(ab cd 4 ef gh 5 0.88)

然而,它从未落地。虽然这有效:

echo "${array[2]}" | sed 's/[A-Za-z]*//g'

这不是:

RemChar="${array[2]}" | sed 's/[A-Za-z]*//g'
echo "$RemChar"

我显然没有掌握如何剥离字符并将它们放入新变量中。

RemChar="${array[2]}" | sed 's/[A-Za-z]*//g'

你没有按照你的期望去做。将它与您的工作版本进行比较:

echo "${array[2]}" | sed 's/[A-Za-z]*//g'

这里是 运行 echosed 一个输入。在第一行中,sed.

没有任何内容

您还期望将执行结果替换为它的值以将其存储在 var 中。为此,您应该使用命令替换语法:

RemChar=$(echo "${array[2]}" | sed 's/[A-Za-z]*//g')

而这一行也是无用回声的一个例子。用 这里的 string:

会更干净
RemChar=$(sed 's/[A-Za-z]*//g' <<< "${array[2]}")

您甚至可以通过使用 bash 提供的工具来避免使用 sed:

RemChar="${array[2]//[A-Za-z]/}"

该模式与您在开头添加的 / 相同,用于告诉 bash 替换字符串中的所有匹配项(模仿 [=16= 中的 g ]).

对于特定元素,

echo $(( ${array[2]#C} - 1 )) # explicitly remove C
4
echo $(( ${array[2]#?} - 1 )) # explicitly remove *any* first character
4
echo $(( ${array[2]//[a-zA-Z]/} - 1 )) # # explicitly remove all letters
4

...但是手动选择元素似乎很奇怪,除非那只是您的数据结构。
循环怎么样?

array=(ab cd C5 ef gh R6 0.88) # create the array

for ndx in "${!array[@]}" # loop over the indexes, 0-6
do if [[ "${array[ndx]}" =~ [[:alpha:]] ]] && # if there's a letter
      [[ "${array[ndx]}" =~ [[:digit:]] ]]    # AND a digit
   then # scrub the letter(s) and decrement the digit, 
        # assign the result over the original value.
        array[ndx]="$(( ${array[ndx]//[[:alpha:]]/} - 1 ))" 
   fi
done

declare -p array # show the new result set

输出:

declare -a array=([0]="ab" [1]="cd" [2]="4" [3]="ef" [4]="gh" [5]="5" [6]="0.88")