rof-ugly.bash

#!/usr/bin/env bash

str="$(cat test.rof)"

declare -A conf


state=""
stOpen="0"
stKey=1

curKey=""
curValue=""

echo "$IFS";

while read -r line; do
    # echo "--${line}--"
    # continue;
    key=$(echo "$line" | sed -E 's/^([a-zA-Z._-]+):.*/\1/')
    
    if [[ "$key" != "$line" ]];then
        if [[ -n "$curKey" ]];then
            # remove trailing whitespace from curValue

            # echo "#####${curValue:(-1)}"
            while [[ "${curValue:(-1)}" == " " || "${curValue:(-2)}" == "\n" ]];do
                # echo "TRIM END"
                if [[ "${curValue:(-1)}" == " " ]];then
                    curValue="${curValue:0:-1}"
                else  
                    curValue="${curValue:0:-2}"
                fi
            done
            
            echo "#####${curValue:(-1)}"
            if [[ "${curValue:(-1)}" == "\\" ]];then
                echo "backslash!!!!!!"
                curValue="${curValue:0:-1}"
            fi

            conf["$curKey"]="$curValue"
            # echo "KEY:${curKey}"
        fi
        len="${#key}"
        len=$(( len + 1 ))
        value="${line:${len}}"

        while [[ "${value:0:1}" == " " ]];do
            value="${value:1}"
        done

        if [[ "${value:0:1}" == "\\" ]];then
            value=${value:1}
        fi
        # echo "##$key"
        # echo "--$value"
        curKey="$key"
        curValue="$value"
    else
        # echo "--$line--"
        if [[ "${line:0:1}" == "\\" ]];then
            line=${line:1}
        fi
        # echo "--$line--"
        # continue;
        if [[ "${line:-1}" == "\\" ]];then
            echo '################trim end'
            line="${line:0:-1}"
        fi
        curValue+="\n"
        curValue+=$line
    fi
done <<< "$str"

# remove trailing whitespace from curValue

# echo "#####${curValue:(-1)}"
while [[ "${curValue:(-1)}" == " " || "${curValue:(-2)}" == "\n" ]];do
    # echo "TRIM END"
    if [[ "${curValue:(-1)}" == " " ]];then
        curValue="${curValue:0:-1}"
    else  
        curValue="${curValue:0:-2}"
    fi
done

echo "#####${curValue:(-1)}"
if [[ "${curValue:(-1)}" == "\\" ]];then
    echo "backslash!!!!!!"
    curValue="${curValue:0:-1}"
fi

conf["$curKey"]="$curValue"
# echo "KEY:${curKey}"

echo 
echo "--TEST--"
echo "${!conf[@]}"
echo -e "--${conf['a.one']}--"
echo -e "--${conf['Another_two-whoo']}--"
echo -e "--${conf['last.fourkey']}--"
echo -e "--${conf['A.Key.three']}--"