Dividir uma string sem delimitador e salvá-la em uma matriz [duplicada]

0

Gostaria de dividir três letras, como WER , em três letras independentes. da seguinte forma:

W = array[0]
E = array[1]
R = array[2]

Eu tentei o comando

WER | cut -c1 , mas não consegui salvar a nova string W em uma variável.

Eu tentei

set var1 = WER | cut -c1 e não funcionou.

    
por user309317 05.09.2018 / 23:21

2 respostas

1

Em bash :

str=WER

a=( "${str:0:1}" "${str:1:1}" "${str:2:1}" )

ou, como um loop sobre uma string arbitrariamente longa:

str=WER

a=()
for (( i = 0; i < ${#str}; ++i )); do
    a+=( "${str:i:1}" )
done

${parameter:offset:length} é uma expansão de substring bash que resultará no length de caracteres da string $parameter do deslocamento offset .

    
por 05.09.2018 / 23:33
1

É mais fácil com zsh :

string=WER
array=(${(s::)string})
printf '<%s>\n' $array

(observe que os índices de array em zsh começam em 1 como na maioria dos outros shells, não em 0 como em bash / ksh ).

Ou com fish (os arrays também começam em 1):

set string WER
set array (string split '' $string)
printf '<%s>\n' $array

(assume que $string não contém caracteres de nova linha).

POSIXly (o shell POSIX tem um array: $@ (também começa em 1: $1 )), assim também funcionaria em bash ou zsh e o padrão do seu sistema sh :

string=WER
set --
while [ -n "$string" ]; do
  tmp=${string#?}
  set -- "$@" "${string%%"$tmp"}"
  string=$tmp
done
printf '<%s>\n' "$@"

Com csh ou tcsh que você parece estar usando:

set string = WER
set array = "'printf '%s\n' $string:q | fold -w1'"
printf '<%s>\n' $array:q

Assim como para fish , ele também assume que a string não contém caracteres de nova linha. Observe também que algumas implementações de fold serão dobradas em bytes em vez de caracteres, o que significa que não funcionará corretamente se a string contiver caracteres de múltiplos bytes.

    
por 05.09.2018 / 23:59