sed またはパターン置換または中括弧拡張を使用する配列の逆値キーペア?

sed またはパターン置換または中括弧拡張を使用する配列の逆値キーペア?
#!/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ループを作成し、新しい配列の値を使用してキーを反転します。コードを数行で行えます。

このようにして作成したすべては、後で他の人がサポートするのがより難しくなり、後でコードを再度訪問したときにどのように機能するかを覚えたり理解したりするのが難しくなります。

おすすめ記事