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)
.