Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在Python中使用zsh拆分字符串_String_Split_Zsh - Fatal编程技术网

String 在Python中使用zsh拆分字符串

String 在Python中使用zsh拆分字符串,string,split,zsh,String,Split,Zsh,在python中: s = '1::3' a = s.split(':') print a[0] # '1' good print a[1] # '' good print a[2] # '3' good 如何使用zsh实现相同的效果 以下尝试失败: string="1::3" a=(${(s/:/)string}) echo $a[1] # 1 echo $a[2] # 3 ?? I want an empty string, as in Python 解决方案是使用@修饰符,如中所示:

在python中:

s = '1::3'
a = s.split(':')
print a[0] # '1' good
print a[1] # '' good
print a[2] # '3' good
如何使用
zsh
实现相同的效果

以下尝试失败:

string="1::3"
a=(${(s/:/)string})
echo $a[1] # 1
echo $a[2] # 3 ?? I want an empty string, as in Python

解决方案是使用
@
修饰符,如中所示:

顺便说一句,如果可以选择分隔符,那么使用换行符作为分隔符会更容易,也不容易出错。使用zsh拆分行的正确方法是:

a=("${(f)string}")

我不知道这里是否也需要引号…

这在zsh(使用
setopt-shwordsplit
zsh-y
)和Bash(基于零的数组)中都适用:


谢谢你能解释一下它是如何工作的吗,这么多的括号让人困惑!如果你试图在斜杠上拆分,原始的
/
s似乎可以替换为
s(例如
a=(${(s |/|)string}”)
。但是,我似乎找不到任何关于这方面的文档,所以可能有一些微妙的行为变化。@Harry,链接的文档说:“任何字符或匹配的对”(…)“,”{…}“,“[…]”或“”,可以用来代替冒号作为分隔符,…。”在Olivier的代码中,“用来代替冒号”的字符是斜杠;在您的代码中,它是竖条。因此,没有行为改变。这在命令行中正常工作,但当我将其移动到函数中时,我得到了“无法识别的修饰符”“错误,有什么想法吗?比IFS bash等同物更容易摸索。感谢这在命令行中对我有效,但在函数中对我无效,即使我确保设置了shwordsplit。我不知道为什么没有。@ws_e_c421:它在zsh和Bash中的函数中对我有效。你没说你在用哪个。您应该能够
echo${a[1]}
echo${a[3]}
并分别获得
1
3
(对于Bash,下标应该是
0
2
)。如果它很短,请在这里张贴您尝试过的内容以及失败的具体原因。如果时间稍长,请在此处发布一个新问题并链接到它。IMHO您应该如何定义环境变量的更改,例如,
IFS=':“cmd args…”
,这样更改将与预期/使用的上下文/寿命结合在一起。那么,你的工作就不是知道你没有使用的先前值,或者管理或重新创建外部环境,等等。相反,它们会自己清理。@JohnP:这种作用域不适用于变量赋值(在本例中,是从标量创建数组)。另一种作用域,使用子shell,在这里不起作用,因为正在创建的数组也将作用于子shell,因此以后不可用。但你的观点在有用的情况下是有效的。@JohnP:对我来说是有效的。这是我从函数内部的echo中看到的输出(添加了缺少的分号):
1,1::3':'
1
是数组
a
的第一个元素,它是拆分
s
的结果。请参阅我之前关于更好地输出数组的评论。我之前没有提到的一点是在函数中使用
localifs=':'
来限制作用域(但这不适用于原始点)。
a=("${(f)string}")
s="1::3"
saveIFS="$IFS"
IFS=':'
a=(${s})
IFS="$saveIFS"