Comment split une string sur un caractère de contrôle?

Je sais comment séparer une string sur un caractère séparateur imprimable; par exemple si le séparateur est:

 FOO='x,y,z' printf "%s\n" ${(s:,:)FOO} x y z 

Mais que faire si le séparateur est un caractère de contrôle, tel que \034 ? Par exemple

 FOO=$'x\034y\034z' 

J'ai essayé de mettre tout ce que je peux penser entre les : dans le qualificateur (s:...:) , y compris \034 , $'\034' , et plusieurs autres, mais rien de ce que j'ai essayé divise l'original string.

(Une solution non acceptable consisterait à effectuer une substitution globale qui remplace toutes les occurrences du délimiteur d'origine, par exemple, puis à split la string résultante par (s:,:) . une solution est que le rationnel pour utiliser `$ '\ 034' en tant que délimiteur est en premier lieu de réduire le risque que le text délimité contienne un délimiteur. Le rlocation du délimiteur d'origine par un caractère imprimable complète cette justification.)


EDIT: concernant la mise en délimiteur dans une variable, j'ai essayé le script de test suivant

 #!/usr/bin/env zsh DELIM=$'\034' FOO="x${DELIM}y${DELIM}z" BAR=(${(ps:$DELIM:)FOO}) printf "%s\n" $BAR BAZ=(${(ps:\034:)FOO}) printf "%s\n" $BAZ 

Le résultat que je reçois est

 x^\y^\z x y z 

(où j'ai utilisé ^\ pour simuler l'apparence de l'imprimé \034 sur mon terminal).

FWIW, ma version de shell est zsh 5.0.7 (x86_64-pc-linux-gnu) .

Vous devez append le drapeau p pour que le drapeau suivant reconnaisse les séquences d'échappement:

 $ FOO=$'x\034y\034z' $ print -rl -- ${(ps:\034:)FOO} x y z 

Si vous ne souhaitez pas coder en dur le délimiteur (nécessite la version> = 5.0.8):

 $ DELIM=$'\034' print -rl -- ${(ps:$DELIM:)FOO}