在 bash 脚本中将文本转换为关联数组

Convert text to associative array in bash script

大家好,我是 bash 脚本的新手。我有一个文本如下所示

input = {'A': '1' 'B': '2' 'C': 'Associative_Array'}

我想使用 bash 脚本将上面的文本转换为关联数组,如下所示。

result = ([A]=1 [B]=2 [C]=Associative_Array)

最好的方法是什么?

另外我转换​​成关联数组后,我想比较两个数组

array_1 = ([A]=1 [B]=2 [C]=Associative_Array)array_2 = ([A]=3 [B]=4 [C]=Associative_Array)

最好的方法是什么?

将变量转换为数组并逐个元素进行比较

input="{'A': '1' 'B': '2' 'C': 'Associative_Array' 'D': 'off'}"
input2="{'B': '4' 'A': '5' 'C': 'Associative_Array'}"
b=$(echo "$input" | sed -nre "s/'([A-Z])': *'([a-zA-Z0-9_]+)'/['']=''/gp" |  tr -d '{}' | tr "'" '"')
c=$(echo "$input2" | sed -nre "s/'([A-Z])': *'([a-zA-Z0-9_]+)'/['']=''/gp" |  tr -d '{}' | tr "'" '"')
#echo "$b"
declare -A arr1="($b)"
declare -A arr2="($c)"
#echo "${arr1['B']}"

for i in "${!arr1[@]}"
do
  if [ "${arr1[$i]}" != "${arr2[$i]}" ]; then
      echo "difference '$i': '${arr1[$i]}' != '${arr2[$i]}'"
  else
      echo "     equal '$i': '${arr1[$i]}' == '${arr2[$i]}'"
 fi
done

结果:

difference 'A': '1' != '5'
difference 'B': '2' != '4'
     equal 'C': 'Associative_Array' == 'Associative_Array'
difference 'D': 'off' != ''

方法二: 将输入字符串转换为 json 并使用 jq

进行处理
in1="{'A': '1' 'B': '2' 'C': 'Associative_Array' 'D': 'off'}"
# making var a json string
in1="$(echo "$in1"  | sed -rne "s/('[A-Z]': *'[a-zA-Z0-9_]+')/,/g ; s/,[}]/}/p" | tr "'" '"')"

declare -A arr1="($(echo "$in1"  | jq -rc 'to_entries[] | "[" + (.key|@sh) + "]=" + (.value|@sh)'))"

for k in "${!arr1[@]}"; do
  echo "key: $k, value: ${arr1[$k]}"
done

结果

key: A, value: 1
key: B, value: 2
key: C, value: Associative_Array
key: D, value: off

建议单个 sed 行:

sed "{s|{'|([|;s|'}|)|;s|': '|]=|g;s|' '| [|g;s| = |=|}" input.txt

结果:

input=([A]=1 [B]=2 [C]=Associative_Array)