Python ZSH 5.05字符串拆分为空
如所述,默认情况下,ZSH会挤压字符串拆分中的相邻分隔符。现在,在ZSH 5.05中,提供的修复程序不起作用Python ZSH 5.05字符串拆分为空,python,bash,split,zsh,Python,Bash,Split,Zsh,如所述,默认情况下,ZSH会挤压字符串拆分中的相邻分隔符。现在,在ZSH 5.05中,提供的修复程序不起作用 Hexagon% string="1::3" Hexagon% setopt interactive_comments Hexagon% a=("${(s/:/)string}") # notice the quotes Hexagon% Hexagon% echo $a[1] # 1, good 1 Hexagon% echo $a[2] # nothing, good 3 Hexa
Hexagon% string="1::3"
Hexagon% setopt interactive_comments
Hexagon% a=("${(s/:/)string}") # notice the quotes
Hexagon%
Hexagon% echo $a[1] # 1, good
1
Hexagon% echo $a[2] # nothing, good
3
Hexagon% echo $a[3] # 3, good
如您所见,我的结果与以前的ZSH记录的结果不匹配。如何模拟此功能,更好的是,是否有一种可移植的方法来实现此功能?在
zsh
中尝试以下操作:
IFS=: read -r -A a <<<"$string"
注:
- Python的
,参数为subprocess.call()
和shell=True
invokeos.system()
,默认情况下,您只能依赖POSIX功能(如果平台与Unix不同,甚至不能依赖于该功能)sh
- 正如@rici所指出的,上述内容不符合POSIX,主要是因为数组变量不是POSIX外壳语言规范的一部分
- @rici还指出,在
中,bash/ksh构造zsh
在获取数组的索引列表(${!a[@]}
)方面明显缺失a
@
标志在拆分中保留空字符串:
a=("${(@s/:/)string}")
@PythonNut:是的,
read
是所有3个shell中的内置程序(bash
,ksh
,zsh
),因此不会启动额外的进程,但是,当然,shell本身就是一个进程。如何调用shell?请注意,默认情况下,Python模块子进程带有参数shell=True
,模块os
带有system()
invokesh
,其中您只能依赖POSIX功能(如果平台与Unix不同,甚至不能依赖于该功能)。@mklement0:printf%s\\n“${a[@]}”
在{ba,k,z}sh
但是包含元素索引并不容易paste@rici:感谢您指出在获取数组索引方面的差异。我的回答通过根据shell调整基本索引来演示显式数字索引的使用。这种差异可以通过zsh
中的emulate sh
解决(显然,还有其他副作用)-但是,这并不能解决中的“${!a[@]}”问题。再说一遍,我甚至不清楚什么是可移植性要求。如果需要严格遵守POSIX,我的答案无论如何也不会起作用。@mklement0:“数组”一词排除了严格遵守POSIX的可能性。我把这个问题理解为关于zsh
,因为这个词在问题中出现了四次,包括标题。(我不知道为什么会有一个bash
标记,尽管我不会看到其他的问题。)当然,比较其他shell中的解决方案总是很有趣的。@rici:谢谢;奇怪的是,(k)
使用普通数组返回值cat-n
便于为从1开始的连续数组生成索引列表,但对于稀疏数组则不方便。事实上,我甚至无法手动复制${!a[@]}
的行为(对于bash/ksh中的稀疏数组,它只返回已定义元素的索引):而zsh
至少允许您通过$#a
找到最大索引(请注意这与bash/ksh有多大区别),它没有实现真正的稀疏数组:所有元素都是隐式定义的,所以像[[-z${a[i]+defined}]]
这样的测试不起作用;很好的了解-绝对是最好的zsh
解决方案(尽管不是便携的)。
a=("${(@s/:/)string}")