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

时间:2019-04-02 12:59:24

标签: arrays bash element

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

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

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"

我显然不了解如何去除字符并将其放入新变量中。

2 个答案:

答案 0 :(得分:1)

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

您没有按预期做。将其与您的工作版本进行比较:

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

您正在运行echo,以向sed提供输入。在第一行中,sed没有任何内容。

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

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

这行也是无用的回声示例。使用此处字符串

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

您甚至可以通过使用bash提供的功能来避免使用sed

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

此模式与您在开头添加/来告诉bash替换字符串中的所有匹配项时使用的模式相同(在g中模仿您的sed

答案 1 :(得分:0)

对于特定元素,

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")