像在Python中一样使用zsh拆分字符串

Oli*_*ier 27 string split zsh

在python中:

s = '1::3'
a = s.split(':')
print a[0] # '1' good
print a[1] # '' good
print a[2] # '3' good
Run Code Online (Sandbox Code Playgroud)

我怎样才能达到同样的效果zsh

以下尝试失败:

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

Oli*_*ier 53

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

string="1::3"
a=("${(@s/:/)string}") # @ modifier
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果一个人可以选择分隔符,那么使用换行符作为分隔符会更容易且更不容易出错.然后使用zsh分割线条的正确方法是:

a=("${(f)string}")
Run Code Online (Sandbox Code Playgroud)

我不知道报价是否也是必要的......

  • 如果你想用斜杠分割,原来的`/`s可以用`|`s替换,看起来(例如`a=(${(s|/|)string}")`)。我可以不过,似乎没有找到任何关于此的文档,所以也许存在一些微妙的行为变化。 (2认同)
  • @Harry,链接的文档说:"任何字符,或匹配对'(...)','{...}','[...]'或'<...>',可以用来代替冒号作为分隔符,......" 在奥利维尔的代码中,用"代替冒号"的字符是斜线; 在你的,它是垂直条.所以,没有行为改变. (2认同)

Pau*_*ce. 8

这将在zsh(带setopt shwordsplitzsh -y)和Bash(从零开始的数组)中工作:

s="1::3"
saveIFS="$IFS"
IFS=':'
a=(${s})
IFS="$saveIFS"
Run Code Online (Sandbox Code Playgroud)