구분 기호 없이 문자열을 분할하고 배열에 저장합니다.

구분 기호 없이 문자열을 분할하고 배열에 저장합니다.

WER세 글자를 세 글자 로 나누고 싶습니다 . 다음과 같이:

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

나는 명령을 시도했다

WER | cut -c1W하지만 새 문자열을 변수에 저장할 수는 없습니다 .

나는 노력했다

set var1 = WER | cut -c1하지만 작동하지 않습니다.

답변1

존재하다 bash:

str=WER

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

또는 임의의 긴 문자열에 대한 루프로 다음을 수행합니다.

str=WER

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

${parameter:offset:length}bash 하위 문자열 확장length그러면 오프셋에서 시작하는 문자열의 문자 수가 제공됩니다 .$parameteroffset

답변2

다음을 사용하는 것이 더 쉽습니다 zsh.

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

(배열 인덱싱은 / 처럼 0 zsh이 아닌 대부분의 다른 쉘처럼 1에서 시작합니다 .)bashksh

또는 다음을 사용하십시오 fish(배열도 1에서 시작함).

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

( $string개행 문자가 포함되지 않는다고 가정).

POSIXly(POSIX 쉘에는 배열이 있습니다: ( $@또한 1: 에서 시작 $1)), 이는 bash또는 zsh시스템의 표준 에서도 작동합니다 sh.

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

당신이 사용하고 있는 것으로 보이는 csh것 :tcsh

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

for 와 마찬가지로 fish문자열에 개행 문자가 포함되어 있지 않다고 가정합니다. 또한 일부 fold구현에서는 문자가 아닌 바이트 단위로 접힐 수 있습니다. 즉, 문자열에 멀티바이트 문자가 포함되어 있으면 올바르게 작동하지 않습니다.

관련 정보