Como dividir uma string em algum delimitador de caracteres não imprimíveis?

1

Eu sei que se $VAR contiver alguma string, eu posso dividir essa string em, digamos, períodos, para produzir uma matriz, assim:

% VAR=$ZSH_VERSION
% parts=(${(s:.:)VAR})
% printf '%s\n' $parts
5
0
7

O que devo colocar entre o : no sinal (s::) para dividir o valor de $VAR nos caracteres com o código ASCII 0, por exemplo?

Eu tentei tudo o que posso pensar. Por exemplo,

% VAR=$'5
% VAR=$ZSH_VERSION
% parts=(${(s:.:)VAR})
% printf '%s\n' $parts
5
0
7
00
% VAR=$'5%pre%00%pre%07'
% parts=(${(s:%pre%0:)VAR})
% printf '%s\n' $parts
5^@0^@7
07' % parts=(${(s:%pre%0:)VAR}) % printf '%s\n' $parts 5^@0^@7

Nada disso funciona.

    
por kjo 07.02.2016 / 19:52

1 resposta

3

Você precisa usar p flag para fazer outros sinalizadores de expansão (siga p ) reconheça a sequência de escape:

$ printf '%s\n' ${(ps:
printf '%s\n' ${(0)VAR}
:)VAR} 5 0 7

ou usando a abreviação:

printf '%s\n' "${(0@)VAR}"

Para preservar elementos vazios:

$ printf '%s\n' ${(ps:
printf '%s\n' ${(0)VAR}
:)VAR} 5 0 7

mas você não pode usar isso para a saída de find ... -print0 , porque adicionou %code% à saída, você sempre obterá o último elemento vazio.

    
por 07.02.2016 / 20:13

Tags