在 shell 脚本中将字符串分解为数组

Sne*_*til 2 shell-script text-processing

我正在尝试将字符串转换为string=11111001数组,我可以通过调用相应的数组索引来访问它

arr[0]=1, arr[1]=0
Run Code Online (Sandbox Code Playgroud)

我是 shell 脚本的新手,从我读到的内容来看,它没有我被卡住的分隔符。

有人能帮我吗?

Dop*_*oti 7

bash 通过字符串切片已经有这样的形式:

$ word="word"
$ printf "%s\n" "${word:0:1}"
w
$ printf "%s\n" "${word:1:1}"
o
Run Code Online (Sandbox Code Playgroud)

其语法是${variable:start:length}, 并将返回lengthstart??开始的下一个字符。字符(零索引)。

$ printf "%s\n" "${word:2:2}"
rd
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 5

为了完整起见,使用zsh, 将字符串拆分为:

特征成分:

chars=( ${(s[])string} )
Run Code Online (Sandbox Code Playgroud)

(如果$string包含不构成有效字符部分的字节,则每个字节仍将作为单独的元素存储)

它的字节成分

您可以执行相同的操作,但在取消设置多字节选项之后,例如在本地匿名函数中:

(){ set -o localoptions +o multibyte
  bytes=( ${(s[])string} )
}
Run Code Online (Sandbox Code Playgroud)

字形簇成分。

您可以使用 PCRE 的功能将它们与\X

zmodload zsh/pcre
(){
  graphemes=()
  local rest=$string match
  pcre_compile -s '(\X)\K.*'
  while pcre_match -v rest -- "$rest"; do
    graphemes+=($match[1])
  done
}
Run Code Online (Sandbox Code Playgroud)

(假设输入包含在语言环境的charmap 中正确编码的文本)。


随着string=$'Ste\u0301phane',那些给出:

chars=( S t e ? p h a n e )
bytes=( S t e $'\M-L' $'\M-\C-A' p h a n e )
graphemes=( S t e? p h a n e )
Run Code Online (Sandbox Code Playgroud)

由于e+ U+0301 字素簇(显示设备通常表示与éU+00E9 预先组合的等价物相同)由 2 个字符(U+0065 和 U+0301)组成,其中在使用 UTF-8 作为其charmap 的语言环境中,第一个在一个字节 (0x65) 上编码,第二个在两个字节 (0xcc 0x81,也称为 Meta-L 和 Meta-Ctrl-A) 上编码。

对于仅由 ASCII 字符组成的字符串,如您的11111001,所有三个将是等效的。

请注意,zsh与除 ksh/bash 之外的所有其他 shell 一样,数组索引从 1 开始,而不是 0。