str='{0,1},alpha,{(x,y,z)},{{1,2,3},{a,b,c}}'
OPTIND=1 l=0 r=0; set ""
while getopts : na -"$str"
do [ "$l" -gt "$r" ]
case $?$OPTARG in
(1,) ! l=0 r=0 ;;
(0}) r=$((r+1)) ;;
(?{) l=$((l+1)) ;;
esac &&
set -- "$@$OPTARG" ||
set -- "$@" ""
done; printf %s\n "$@"
dash
tem um bug que requer algo como:
set -- "$@" ""; str=${str#?}
... mas além disso, o que foi dito acima deve ser bem rápido, e funcionar basicamente em qualquer shell POSIX, além de ser bastante simples. Ele também deve lidar com pares incompatíveis (mesmo que você não precise) , deixando de reconhecer especialmente um }
que ocorre antes de um {
.
{0,1}
alpha
{(x,y,z)}
{{1,2,3},{a,b,c}}
Para obter sua string prefixada e as aspas ao redor, você pode substituir o seguinte ...
printf "Word='%s'\n" "$@"
... para o printf %s\n "$@"
usado acima. Dado o valor de exemplo de $str
aqui, seria impresso:
Word='{0,1}'
Word='alpha'
Word='{(x,y,z)}'
Word='{{1,2,3},{a,b,c}}'
Mais solidamente você pode fazer ...
for W do alias "Word=$W" Word; done
... que renderizaria ...
Word='{0,1}'
Word=alpha
Word='{(x,y,z)}'
Word='{{1,2,3},{a,b,c}}'
... citado conforme necessário, e citaria corretamente aspas fixas bem (embora, se estiver usando um bash
, você pode querer fazer set --posix
primeiro) .
E assim, por uma questão de demonstração ...
str="{0,1
}}, {,}alph}'a, {(x,y,z)}, {{1,2,3}, {a,b,c}}"
OPTIND=1 l=0 r=0; set ""
while getopts : na -"$str"
do [ "$l" -gt "$r" ]
case $?$OPTARG in
(1,) ! l=0 r=0 ;;
(0}) r=$((r+1)) ;;
(?{) l=$((l+1)) ;;
esac &&
set -- "$@$OPTARG" ||
set -- "$@" ""
done; for W do alias "Word=${W# }" Word
done
Word='{0,1
}}'
Word='{,}alph}'\''a'
Word='{(x,y,z)}'
Word='{{1,2,3}, {a,b,c}}'
... onde até mesmo os espaços principais são tratados de forma simples ...