我有一个数组,其中有两个在当前状态下没有用的元素,我需要删除一个字符并从中减去一个。
我试图剥离字符,以便可以将数字放入方程式中,但似乎没有将新的无字符元素保存到变量中。
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"
我显然不了解如何去除字符并将其放入新变量中。
答案 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")