2010-05-28 7 views
21

en python:chaîne Split avec zsh comme en Python

s = '1::3' 
a = s.split(':') 
print a[0] # '1' good 
print a[1] # '' good 
print a[2] # '3' good 

Comment puis-je obtenir le même effet avec zsh?

La tentative suivante échoue:

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

Répondre

43

La solution est d'utiliser le modificateur @, comme il est indiqué dans the zsh docs:

string="1::3" 
a=("${(@s/:/)string}") # @ modifier 

Par ailleurs, si l'on a le choix du délimiteur, c'est beaucoup plus facile et moins sujet à l'erreur d'utiliser un saut de ligne comme délimiteur. La bonne façon de diviser les lignes avec zsh est alors:

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

Je ne sais pas si les guillemets sont nécessaires ici aussi ...

+1

Merci. Êtes-vous capable d'expliquer comment cela fonctionne, tant de supports le rendent confus! – CMCDragonkai

+0

Si vous essayez de scinder sur des barres obliques, les '/' s d'origine peuvent être remplacés par '|' s, il semble (par exemple 'a = ($ {(s |/|) chaîne}") '). ne peut pas trouver de documentation sur ceci, cependant, peut-être il y a un changement de comportement subtil –

+2

@Harry, la documentation liée dit ceci: "N'importe quel caractère, ou les paires correspondantes" (...) ',' {. ..} ',' [...] 'ou' <...> ', peut être utilisé à la place d'un deux-points comme délimiteurs, ... "Dans le code d'Olivier, le caractère" utilisé à la place d'un deux-points "était slash; –

7

Cela fonctionne dans les deux zsh (avec setopt shwordsplit ou zsh -y) et Bash (ensembles à base zéro):

s="1::3" 
saveIFS="$IFS" 
IFS=':' 
a=(${s}) 
IFS="$saveIFS" 
+0

Cela a fonctionné pour moi sur la commande ligne mais ne fonctionnerait pas pour moi dans une fonction, même si je me suis assuré que shwordsplit a été mis en place.Je ne suis pas sûr de savoir pourquoi il ne l'a pas. –

+0

@ ws_e_c421: Cela fonctionne pour moi dans une fonction dans zsh et Bash. Vous n'avez pas dit ce que vous utilisez. Vous devriez pouvoir 'echo $ {a [1]}' et 'echo $ {a [3]}' et obtenir '1' et' 3', respectivement (les indices devraient être '0' et' 2' pour Frapper). Si c'est court, postez ici ce que vous avez essayé et comment exactement il a échoué. Si c'est un peu plus long, postez une nouvelle question et faites un lien ici. –