Como dividir uma string em um caractere de controle?

3

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

    
por kjo 02.03.2016 / 04:01

1 resposta

3

Você precisa adicionar p flag para fazer o seguinte sinalizador reconhecer as seqüências de escape:

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

Se você não quiser codificar o delimitador (requer versão > = 5.0.8):

$ DELIM=$'4'
print -rl -- ${(ps:$DELIM:)FOO}
    
por 02.03.2016 / 04:07

Tags