#!/bin/bash
arr=(a b c d)
declare -A brr
for i in ${!arr[@]}
do
brr[${arr[$i]}]=$i
done
echo ${brr[@]} #0 1 2 3
sed
또는 다른 명령을 사용하여 값과 키 쌍을 되돌릴 수 있는 방법이 있습니까 ? 내 생각엔 그냥 해야 할 것 같아bash 루프를 사용하는 대신 텍스트의 일부 패턴 변경을 수행합니다., 아마도 다음과 같습니다.
brr=($(echo ${!arr[@]} | sed commands))
중괄호 확장을 사용하면 새 배열이 brr=([a]=0 [b]=1 [c]=2 [d]=3)
다음과 같이 됩니다.
#!/bin/bash
arr=(a b c d)
declare -A brr
var=${arr[@]}
var=${var// /,}
brr=$(eval echo [{$var}]=)
echo $brr #[a]= [b]= [c]= [d]=
이제 0,1,2,3 키만 추가하면 됩니다.
편집하다: 할 수 있었는데 특히 sed
선을 더 짧고 간단하게 만들 수 있을까요?
#!/bin/bash
arr=(a b c d)
declare -A Rev
var=${arr[@]} #var is equal to a b c d
var=${var// /,} #var is equal to a,b,c,d after adding , for space
brr=$(eval echo Rev[{$var}]=) #brr equal to Rev[a]= Rev[b]= Rev[c]= Rev[d]=
#NOW I NEED TO CHANGE
#Rev[a]= Rev[b]= Rev[c]= Rev[d]=
#to
#Rev['a']=0;Rev['b']=1;Rev['c']=2;Rev['d']=3
r="$(echo $brr |
sed 's/ /\n/g' | sed '/./=' | sed '/./N; s/\n//' |
sed 's/\(^[0-9]\{1,\}\)\(.*\)/\2$(echo \1 - 1 | bc)/' | tr '\n' ';' |
sed "s/\[/\[\'/g;s/\]/\'\]/g")"
#pipe the output of echo(Rev[a]= Rev[b]= Rev[c]= Rev[d]=) to sed
#convert space to newlines
#add line numbers
#put the line numbers adjacent to the values Rev[a],Rev[b],Rev[c],Rev[d] like
# 1rev[a]=
# 2Rev[b]=
# 3Rev[c]=
# 4Rev[d]=
#change 1Rev[a]= format to Rev[a]=1
#convert newlines to ; looking like Rev[a]=0;Rev[b]=1;Rev[c]=2;Rev[d]=3
#put quotes around the keys Rev['a']=0;Rev['b']=1;Rev['c']=2;Rev['d']=3
eval $r
echo ${Rev[@]} #0 1 2 3
echo ${!Rev[@]} #a b c d
답변1
나는 @ChrisDown의 조언에 귀를 기울이고 여기서 영리한 일을 시도하지 않을 것입니다. for 루프를 만들고 새 배열의 값으로 키를 반대로 바꾸겠습니다. 단지 몇 줄의 코드일 뿐입니다.
이런 방식으로 만든 모든 것은 다른 사람들이 나중에 지원하기가 더 어려울 것이며 나중에 코드를 다시 방문할 때 그것이 어떻게 작동하는지 기억/이해하기가 더 어려울 것입니다.
답변2
#!/bin/bash
arr=(a b c d)
set -- $(echo ${arr[@]} | tr ' ' '\n' | sed "s/.*/arr['&']=/")
eval echo $(seq 1 ${#arr[@]} | sed 's/\(.*\)/${\1}$(echo \1 -1 | bc)/')
또는
#!/bin/bash
declare -A brr
arr=(a b c d)
eval "brr=($(eval echo $(sed 's/\([0-9]\)/[${arr[\1]}]=\1/g' <(echo ${!arr[@]}))))"
echo ${brr[@]}
산출:
#arr['a']=0 arr['b']=1 arr['c']=2 arr['d']=3
답변3
다른 사람들이 말했듯이, 나는 sed
어려운 해결책이 될 것이라고 생각합니다.
다음 루프는 원하는 것을 달성할 수 있습니다.
arr=(a b c d)
for i in ${!arr[@]}; do
brr+=("[${arr[$i]}]=$i")
done
echo ${brr[@]}
#[a]=0 [b]=1 [c]=2 [d]=3