在 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)
大家好,我是 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)