Isso porque (.*)
é muito ganancioso.
perl tem correspondência não-gananciosa:
perl -nE 'if (/--key1 (.*?) --/) {say $1}' <<< "$input"
Se você realmente quiser usar a análise de opções adequada:
eval set -- "$(getopt --long key1:,key2:,key3: -- $input)" # $input is unquoted!
while :; do
case "$1" in
--key1) key1=$2; shift 2;;
--key2) key2=$2; shift 2;;
--key3) key3=$2; shift 2;;
--) shift; break;;
esac
done
[[ "$output" = "$key1" ]] && echo OK