Чтение пары ключ-значение в Bash, где значение содержит разделитель - PullRequest
3 голосов
/ 08 октября 2019

Как прочитать файл пары ключ-значение в ассоциативный массив, если часть значения может иметь разделитель в значении? Итак, разбейте строку на первое вхождение разделителя и сохраните в ассоциативном массиве.

Пример содержимого файла KVP:

key=value
key1=[SHA:]$value()%_&+=

Я хотел бы сделать что-то вроде

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

Это пример неработающего кода, который теряет завершающий = в key1 из примера файла выше.

while IFS=$'=' read key value; do
     [[ $key = [#!]* ]] || [[ $key = "" ]] && continue;
     keyvals[$key]=$(echo "$value" | sed 's/[\/&]/\\&/g')
   done < $SFILE

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Вы можете использовать расширение параметра для удаления всего , начиная с первого = для ключа, и всего до первого = для значения:

declare -A keyvals

while IFS= read -r line; do
    keyvals["${line%%=*}"]=${line#*=}
done < "$KVP_FILE"
0 голосов
/ 08 октября 2019

Используйте 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...