在Bash中读取键值对,其中值包含分隔符

在Bash中读取键值对,其中值包含分隔符,bash,Bash,当值部分的值中可能包含分隔符时,如何将键值对文件读入关联数组?因此,在第一次出现分隔符时拆分该行,并将其存储在关联数组中 KVP文件内容示例: key=value key1=[SHA:]$value()%_&+= 我想做点像 KVP_FILE="./file.properties" declare -A keyvals while read line; do ?? keyvals[$key]="$value" done < $KVP_FILE 使用sed将第一个分隔符替换

当值部分的值中可能包含分隔符时,如何将键值对文件读入关联数组?因此,在第一次出现分隔符时拆分该行,并将其存储在关联数组中

KVP文件内容示例:

key=value
key1=[SHA:]$value()%_&+=
我想做点像

KVP_FILE="./file.properties"
declare -A keyvals
while read line; do 
 ??
 keyvals[$key]="$value"
done < $KVP_FILE

使用
sed
将第一个分隔符替换为换行符。然后一次读两行

KVP_FILE="./file.properties"
declare -A keyvals
while read -r key && read -r value; do 
   keyvals[$key]="$value"
done < <(sed 's/=/\n/' "$KVP_FILE")
KVP_FILE=“./FILE.properties”
声明-一个keyvals
而read-r键和read-r值;做
keyvals[$key]=“$value”

完成<您可以使用参数展开删除从键的第一个
=
开始的所有内容,以及从值的第一个
=
开始的所有内容:

declare -A keyvals

while IFS= read -r line; do
    keyvals["${line%%=*}"]=${line#*=}
done < "$KVP_FILE"
declare-A keyvals
而IFS=读取-r行;做
keyvals[“${line%%=*}”]=${line*=}
完成<“$KVP_文件”

对@KamilCuk感兴趣我看到你的留言了。我正在努力学习如何分割,但只使用第一个分隔符。(我不得不编辑我的示例文件以显示尾随的“=”,我不想丢失它)。哦,的确,你是对的,
IFS==read
将删除尾随的分隔符。帕夫,所以我们必须换一种方式。哎哟,真的;-)我将对KVPfile进行预处理,为值端的任何shell语法字符添加专门的标记(可能是html代码?)。然后,当您使用该值时,必须撤消该值(并保护它不受shell interpeter的影响)。为什么要这样做;-?)。祝你好运这是个好问题。有一个使用连接信息更新的文件,这些值通过此脚本放入其他配置文件中。例如,可能有带有&的URL被替换到带有sed的配置中。一行上可能有多个=的连接键哈希。不幸的是,keyvals[“${line%%=*}]”:错误的数组下标我的错误!正如您在我的原始问题中所看到的,我有一行可以跳过注释和空行,但在尝试您的解决方案时错误地删除了它。我认为您的解决方案对我的问题是正确的。似乎是完成行中的语法错误。但是我不太清楚的意图是什么,谢谢你的解释。然而,与此同时,我找到了本杰明的工作解决方案。
declare -A keyvals

while IFS= read -r line; do
    keyvals["${line%%=*}"]=${line#*=}
done < "$KVP_FILE"