Eu sei dividir uma string em um caractere separador imprimível; por exemplo. se o separador for , :
FOO='x,y,z'
printf "%s\n" ${(s:,:)FOO}
x
y
z
Mas e se o separador for um caractere de controle, como 4 ? Por exemplo
FOO=$'x4y4z'
Eu tentei colocar tudo em que posso pensar entre os : no qualificador (s:...:) , incluindo 4 , $'4' e vários outros, mas nada que eu tentei divide a string original .
(Uma solução que não é aceitável seria executar uma substituição global que substitua todas as ocorrências do delimitador original por, por exemplo, , e, em seguida, dividir a string resultante com (s:,:) . Essa solução é que o racional para usar '$' \ 034 'como delimitador em primeiro lugar é reduzir a chance de que o texto delimitado contenha um delimitador. Substituir o delimitador original por um que pode ser impresso exclui completamente esse raciocínio.)
EDIT: sobre colocar o delimitador em uma variável, eu tentei o seguinte script de teste
#!/usr/bin/env zsh
DELIM=$'4'
FOO="x${DELIM}y${DELIM}z"
BAR=(${(ps:$DELIM:)FOO})
printf "%s\n" $BAR
BAZ=(${(ps:4:)FOO})
printf "%s\n" $BAZ
A saída que recebo é
x^\y^\z
x
y
z
(onde usei ^\ para simular a aparência do 4 impresso no meu terminal.)
FWIW, minha versão do shell é zsh 5.0.7 (x86_64-pc-linux-gnu) .