拆分不带分隔符的字符串并将其保存在数组中

拆分不带分隔符的字符串并将其保存在数组中

我想将三个字母分成WER三个独立的字母。如下:

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

我尝试了命令

WER | cut -c1但我无法将新字符串保存W在变量中。

我试过

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 子串扩展这将得出从 offset 开始length的字符串的字符数。$parameteroffset

答案2

使用以下方法更容易zsh

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

(请注意,像大多数其他 shell 一样,数组索引zsh从 1 开始,而不是像bash/那样从 0 开始ksh)。

或者使用fish(数组也从 1 开始):

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

(假设$string不包含换行符)。

POSIXly(POSIX shell 有一个数组:($@也从 1: 开始$1)),因此也可以在bashorzsh和您系统的标准中工作sh

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

cshtcsh您似乎正在使用的:

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

与 for 一样fish,它也假设字符串不包含换行符。另请注意,某些fold实现将按字节而不是字符折叠,这意味着如果字符串包含多字节字符,它将无法正常工作。

相关内容