Sne*_*til 2 shell-script text-processing
我正在尝试将字符串转换为string=11111001
数组,我可以通过调用相应的数组索引来访问它
arr[0]=1, arr[1]=0
Run Code Online (Sandbox Code Playgroud)
我是 shell 脚本的新手,从我读到的内容来看,它没有我被卡住的分隔符。
有人能帮我吗?
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}
, 并将返回length
从start
??开始的下一个字符。字符(零索引)。
$ printf "%s\n" "${word:2:2}"
rd
Run Code Online (Sandbox Code Playgroud)
为了完整起见,使用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。
归档时间: |
|
查看次数: |
373 次 |
最近记录: |